Concepto: tipos culpables

Propongo el concepto de tipo Faultable: modificación de tipos por analogía con nullable. La conclusión es que este tipo puede adquirir un significado especial si algo salió mal durante la ejecución del programa: no se encontró el archivo requerido, se produjo una división por 0, etc. Este tipo está diseñado para tratar los errores tan cerca de donde ocurren, a diferencia de las excepciones, que son más adecuadas para manejar errores de forma centralizada. Para no cambiar el diseño 100,500 veces, lo llamaré "tipo erróneo", sin importar lo gracioso que suene.







Anuncio



Cualquier argumento de variable o función puede declararse erróneo.







faultable int number;
faultable string fileName;
faultable Customer user;
void markCustomer (faultable string name){
 ...
}
      
      





El valor de retorno de la función se vuelve erróneo de hecho, si en alguna de las ramas hay un retorno de un error o un valor erróneo.

El tipo automático se considera infalible a menos que se indique lo contrario.







Asignar un error



La característica principal por la que se introduce este tipo es la capacidad de asignarle un significado especial: el significado de un error utilizando una palabra clave especial. El valor de error puede ir acompañado de una descripción o clase de error.







number = fault;
filename = fault("  ");
return(fault(EOleException));
      
      





Asignaciones a tipo normal



A diferencia de los tipos que aceptan valores NULL, un tipo erróneo puede pasar directamente un valor a variables de un tipo infalible y viceversa:







faultable int selNumber = 255;
...
int outNumber = selNumber;
      
      





Pero al intentar asignar un error a un valor infalible, el compilador debe salir de la función y devolver un error:







faultable int selNumber = fault;
...
int outNumber = selNumber;//   
      
      





Se debe generar un error si el error devuelto por la función no está asignado a nada







int parseMyDate(string strDate)
{
    ...
    return(fault);
}
...
parseMyDate("This is not a date");//
      
      





, , , , , :







faultable Customer payer;
...
payer=fault("Customer not found");
...
faultable string name = customer.name;//    
      
      





, , try...catch. .









, .







name=customer.name nofault;//   ,     name   
      
      





,







name=customer.name nofault "unknown";
      
      





, :







var file=openFile(path) nofault(EFileNotExists) createFile(path);
      
      











if (!variable.isFault()){
    outVar = variable;
}
else
{
    ...
}
      
      









, amount = struct.getField("amount").toInteger() nofault 0;



,







try
{
    amount = struct.getField("amount").toInteger();
}
catch
{
    amount = 0;
}
      
      







, . , , . .









, . catch/throw, « ».









, .











, , . , - . , . , , , — -, — , . , , .









, . — . , , .








All Articles