2009-11-26 13 views
24

He creado la clase de excepción personalizadaTipo de excepción en un manejador

public class Web2PDFException : Exception 
{ 
    public Web2PDFException(string message, 
     Exception innerException) 
     : base(message, innerException) 
    { 
    } 
} 

En mi solicitud me quiero averiguar es excepción tiro es mi excepción personalizada o no.

try 
{ 
} 
catch (Exception err) 
{ 
//Find exception type here 
} 

Respuesta

33

ACTUALIZADO: suponiendo C# 6, lo más probable es que su caso se puede expresar como un filtro de excepción. Este es el enfoque ideal desde una perspectiva de rendimiento suponiendo que el requisito se puede expresar en términos de la misma, por ejemplo:

try 
{ 
} 
catch (Web2PDFException ex) when (ex.Code == 52) 
{ 
} 

Suponiendo C# < 6, el más eficiente es coger un tipo específico Exception y no la manipulación basado en eso. Cualquier cajón de sastre de manipulación se puede hacer por separado

try 
{ 
} 
catch (Web2PDFException ex) 
{ 
} 

o

try 
{ 
} 
catch (Web2PDFException ex) 
{ 
} 
catch (Exception ex) 
{ 
} 

o (si es necesario escribir un manejador en general - que es generalmente una mala idea, pero si está seguro de que es mejor para usted, usted puede estar seguro):

if(err is Web2PDFException) 
{ 
} 

o (en algunos casos si es necesario hacer algunas cosas más compleja jerarquía de tipos que no puede ser expresado con is)

if(err.GetType().IsAssignableFrom(typeof(Web2PDFException))) 
{ 
} 

o cambiar a VB.NET o C# y utilizar is o Type.IsAssignableFrom en Filtros de excepción

+0

si (err es Web2PDFException) es que necesitaba :) – Tomas

+0

Para utilizar el " es "operador que no necesita cambiar a VB.NET –

+0

@BeowulfOF: lo sé, pero si solo está tratando de filtrar según los tipos, es decir, algún tipo de captura condicional, etc., puede ser útil usar un es * en un filtro de excepción en lugar de un bloque catch * - puede ser una vía de aproximación que funcione. Mi sugerencia inicial (y todavía está en la respuesta) es una está en el bloque catch. En pocas palabras, dado que usar un 'es' es normalmente un mal olor, también podríamos tener una larga lista de posibles soluciones y dejar que Tomas elija lo que más le convenga en su contexto específico. Pero sí, es poco probable. –

15
try 
{ 
    // Some code 
} 
catch (Web2PDFException ex) 
{ 
    // It's your special exception 
} 
catch (Exception ex) 
{ 
    // Any other exception here 
} 
+0

Si hay 10 excepciones conocidas, la cadena de captura se verá fea. – derek

1

Siempre debe capturar las excepciones lo más concreto posible, por lo que debe utilizar

try 
{ 
    //code 
} 
catch (Web2PDFException ex) 
{ 
    //Handle the exception here 
} 

Por supuesto, debería utilizar algo como esto si insiste:

try 
{ 
} 
catch (Exception err) 
{ 
    if (err is Web2PDFException) 
    { 
     //Code 
    } 
} 
5
try 
{ 
} 
catch (Exception err) 
{ 
    if (err is Web2PDFException) 
     DoWhatever(); 
} 

pero es probable que haya una forma mejor de hacer lo que sea que desee.

+0

¿Por qué se bajó este voto? Es equivalente a muchos otros ejemplos. – jp2code

1

puede añadir alguna información adicional a su excepción en su clase y luego cuando se captura la excepción puede controlar su información personalizada para identificar su excepción

this.Data["mykey"]="keyvalue"; //you can add any type of data if you want 

y entonces se puede obtener el valor de su

string mystr = (string) err.Data["mykey"]; 

así para más información: http://msdn.microsoft.com/en-us/library/system.exception.data.aspx

+0

No estoy seguro de por qué esto fue downvoted tampoco. Esto ofrece una buena manera de proporcionar datos adicionales a su código. – jp2code

+0

@ jp2code Supongo que porque no responde al OP? –

54

Cuando se trata de situaciones en las que Don No sé exactamente qué tipo de excepción podría surgir de un método, un pequeño "truco" que me gustaría hacer es recuperar el nombre de clase de la Excepción y agregarlo al registro de errores para que haya más información.

try 
{ 
    <code> 

} catch (Exception caughtEx) 
{ 
    throw new Exception("Unknown Exception Thrown: " 
         + "\n Type: " + caughtEx.GetType().Name 
         + "\n Message: " + caughtEx.Message); 
} 

Yo respondo de manipulación es obligatorio tipos de excepciones de forma individual, pero el toque adicional de información puede ser útil, especialmente cuando se trata de código de las personas que aman a capturar de captura-todos los tipos genéricos.

+6

Estoy confundido aquí (especialmente por los votos a favor). ¿Está reemplazando una excepción útil con una stacktrace con otra que solo tiene los aspectos más destacados? Incluso si hizo la excepción refiérase a 'caughtEx' como un niño, me pregunto cuál es el punto (si muestra el completo' exception.ToString() 'de todos modos le mostrará el tipo). Podría entender si estaba registrando en este punto antes de hacer un 'throw;' ... –

+4

En mi caso, necesitaba esto para fines de registro, por lo que 'caughtEx.GetType(). Name' era exactamente lo que estaba buscando . ¡Gracias! – mayabelle

+0

@RubenBartelink Sí, de hecho, el razonamiento es hacer que la excepción aparezca en un archivo de registro en lugar de la traza de la pila un tanto molesto. Como con cualquier cosa, depende de lo que necesites. En general, codigo el manejo de excepciones de esa manera durante el desarrollo, así puedo rastrear fácilmente los errores, y luego limpiarlos o ajustarlos según sea necesario (invocando los rastreos de la pila cuando sea necesario). Como dije, la mayoría de las veces recurro a esto cuando trabajo con bases de código donde los desarrolladores anteriores descuidaron el manejo de excepciones adecuado. – Oskuro

1

alternativa:

var exception = err as Web2PDFException; 

if (excecption != null) 
{ 
    Web2PDFException wex = exception; 
    .... 
} 
4

en lugar de codificar duro y volver a compilar, ¿por qué no llamar al método GetType fuera de la excepción real utilizando Visual Studio depurador de?

Para hacer eso, mientras se depura uno puede llamar a métodos usando el Immediate Window del depurador. Por ejemplo lo que necesitaba saber cuál era la excepción y acaba de extraer la propiedad Name de GetType como tal sin tener que recompilar:

enter image description here

Cuestiones relacionadas