Veamos un ejemplo de una clase y cómo valida la regla de negocios antes de lanzar excepciones.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 usando el sistema;namespace MyApp{classAccount{publicAccount(string name,int balance){if(name ==null){thrownewArgumentNullException(nameeof(name));} Nombre = nombre; Saldo = saldo;}nombre de la cadena pública {get;privateset;}publicint Saldo {get;privateset;}publicbool está bloqueado {get;set;}publictringGetLastName(){var partes = Nombre.Split($0027 $0027);if(partes. Longitud <2){thrownewInvalidOperationException("¡Nombre inválido!");}devolver partes[1];}publicvoidCredit(int amount){if(IsBlocked){thrownewInvalidOperationException("La transacción no puede realizarse en una cuenta bloqueada");} Saldo = importe + Saldo;}publicvoidDebit(int importe){if(IsBlocked){thrownewInvalidOperationException("La transacción no se puede realizar en una cuenta bloqueada");} Saldo = Saldo - cantidad;}}
csharp
La clase de arriba tiene las propiedades Nombre, Equilibrio e IsBloqueado. Hay algunos lugares en el código en los que hemos usado la declaración de lanzamiento para hacer una excepción. En el constructor, comprueba si la propiedad Nombre es nula. Si es nula, lanza una excepción. El método GetLastName plantea una excepción de InvalidOperationException si el valor de la propiedad Name no contiene dos nombres separados por espacios en blanco. Asimismo, tanto el método Credit como el Debit arrojan una excepción si la cuenta está marcada como bloqueada. Podemos acortar la longitud del código lanzando esas excepciones desde las expresiones.
Para refactorizar el constructor, quitaremos la frase «si» y la sustituiremos por un operador de coalescencia nula y luego aplicaremos la frase de lanzamiento de la expresión como sigue:
12345publicAccount(string name,int balance){ Name = nombre ??thrownewArgumentNullException(nameeof(name)); Balance = balance;}
csharp
De la misma manera, también podemos lanzar excepciones del operador ternario. Podemos aplicarlo a los métodos GetLastName, Debit, and Credit de la siguiente manera:
123456789101112publicstringGetLastName(){var parts = Name.Split($0027 $0027);return parts.Length >1? parts[1]:thrownewInvalidOperationException("Invalid name!");}publicvoidDebit(int amount){ Balance = IsBlocked ? thrownewInvalidOperationException("La transacción no puede ser realizada en una cuenta bloqueada"):(Balance - cantidad);}publicvoidCredit(int amount)=> Balance = IsBlocked ?thrownewInvalidOperationException("La transacción no puede ser realizada en una cuenta bloqueada"):(amount + Balance);
csharp
Los métodos Débito y Crédito realizan una operación similar, excepto que uno elimina del Balance mientras que el otro añade. Cambiamos el Crédito por un método de expresión y dejamos el Débito con la declaración del método estándar. Esto demuestra que podemos aplicarlo a cualquier miembro de una clase con cuerpo de expresión. Por ejemplo, si definimos un método que no funciona para poder implementarlo más tarde. Podemos definir ese método con cuerpo de expresión como la cadena pública GetFirstName() => throw new NotImplementedException();.