que - tipos de excepciones en c#
¿Hay una manera de lanzar una excepción personalizada sin clase de excepción (5)
¿Hay alguna forma en C # (es decir, en .NET) de lanzar una excepción personalizada pero sin escribir todo el código para definir su propia clase de excepción derivada de Exception
?
Estoy pensando en algo similar, por ejemplo, en Oracle PL / SQL, donde simplemente puede escribir
raise_application_error(-20001, ''An arbitary error message'');
en cualquier lugar
La clase de Exception
no es un abstract
, y como la mayoría de las excepciones definidas en .NET, recibe un string message
en una de las sobrecargas del constructor; por lo tanto, puede usar un tipo de excepción existente, pero con un mensaje personalizado.
throw new Exception("Something has gone haywire!");
throw new ObjectDisposedException("He''s Dead, Jim");
throw new InvalidCastException(
$"Damnit Jim I''m a {a.GetType().Name}, not a {b.GetType().Name}!");
Debido a que utiliza tipos de excepción conocidos, hace que sea más fácil para otras partes extender sus bibliotecas también, ya que no necesitan buscar la MyArbitraryException
en catch
declaraciones catch
.
Respuesta corta - no.
Hay una buena razón para imponer la herencia de excepciones personalizadas; La gente necesita poder manejarlos. Si pudieras lanzar tu excepción personalizada sin tener un tipo, las personas no podrían capturar ese tipo de excepción.
Si no desea escribir una excepción personalizada, use un tipo de excepción existente.
Solo puedes lanzar una de las excepciones que está disponible en .NET:
throw new System.ArgumentException("Parameter cannot be null", "original");
O más genérico:
throw new ApplicationException("File storage capacity exceeded.");
Una forma fácil de crear excepciones personalizadas en c # es usar una clase genérica. Esto reduce dramáticamente las líneas de código si necesita crear muchas excepciones (es decir, si necesita distinguirlas en sus pruebas unitarias).
Primero crea una clase simple llamada CustomException<T>
:
public class CustomException<T> : Exception where T : Exception
{
public CustomException() { }
public CustomException(string message) : base(message){ }
public CustomException(string message, Exception innerException) : base(message, innerException){ }
public CustomException(SerializationInfo info, StreamingContext context) : base(info, context){ }
}
Puede anular tantos constructores y métodos como desee (o necesite). Para crear nuevos tipos de Excepciones, simplemente agregue nuevas clases de una sola línea:
public class MyCustomException : Exception { }
public class SomeOtherException : Exception { }
Si desea aumentar su uso de excepción personalizado:
throw new CustomException<MyCustomException>("your error description");
Esto mantiene su código de excepción simple y le permite distinguir entre esas excepciones:
try
{
// ...
}
catch(CustomException<MyCustomException> ex)
{
// handle your custom exception ...
}
catch(CustomException<SomeOtherException> ex)
{
// handle your other exception ...
}
throw new Exception("A custom message for an application specific exception");
¿No es suficiente?
También puedes lanzar una excepción más específica si es relevante. Por ejemplo,
throw new AuthenticationException("Message here");
o
throw new FileNotFoundException("I couldn''t find your file!");
podría funcionar.
Tenga en cuenta que probablemente no debería throw new ApplicationException()
, por MSDN .
La principal desventaja de no personalizar la Excepción es que será más difícil de atrapar para las personas que llaman, no sabrán si se trata de una excepción general o específica de su código sin hacer una inspección extravagante en la propiedad excepción.Mensaje. Podrías hacer algo tan simple como esto:
public class MyException : Exception
{
MyException(int severity, string message) : base(message)
{
// do whatever you want with severity
}
}
para evitar eso.
Actualización : Visual Studio 2015 ahora ofrece una implementación automática de las clases de extensión de Excepción: si abre el menú Acciones rápidas y refactorización con el cursor en : Exception
, solo dígale a "Generar todos los constructores".