Идентификация типа исключения в обработчике
Я создал собственный класс исключений
public class Web2PDFException : Exception
{
public Web2PDFException(string message,
Exception innerException)
: base(message, innerException)
{
}
}
В моем приложении я хочу выяснить, исключение throw - это мое обычное исключение или нет.
try
{
}
catch (Exception err)
{
//Find exception type here
}
Ответы
Ответ 1
ОБНОВЛЕНО: предполагая С# 6, есть вероятность, что ваш случай может быть выражен как фильтр исключений. Это идеальный подход с точки зрения производительности, если ваше требование может быть выражено в терминах этого, например:
try
{
}
catch ( Web2PDFException ex ) when ( ex.Code == 52 )
{
}
Предполагая, что С# 6, наиболее эффективным является захват определенного типа Exception
и обработка на основе этого. Любая обработка всего защелки может быть сделана отдельно
try
{
}
catch ( Web2PDFException ex )
{
}
или
try
{
}
catch ( Web2PDFException ex )
{
}
catch ( Exception ex )
{
}
или (если вам нужно написать общий обработчик, который, как правило, плохая идея, но если вы уверены, что это лучше всего для вас, вы уверены):
if( err is Web2PDFException)
{
}
или (в некоторых случаях, если вам нужно сделать более сложный тип иерархии, который не может быть выражен с помощью is
)
if( err.GetType().IsAssignableFrom(typeof(Web2PDFException)))
{
}
или переключиться на VB.NET или F # и использовать is
или Type.IsAssignableFrom
в фильтрах исключений
Ответ 2
При работе с ситуациями, когда я точно не знаю, какой тип исключения может возникнуть из метода, немного "трюк", который мне нравится делать, это восстановить имя класса Exception и добавить его в журнал ошибок, чтобы там больше информации.
try
{
<code>
} catch ( Exception caughtEx )
{
throw new Exception("Unknown Exception Thrown: "
+ "\n Type: " + caughtEx.GetType().Name
+ "\n Message: " + caughtEx.Message);
}
Я действительно ручаюсь за то, что всегда обрабатывал типы исключений индивидуально, но дополнительный бит информации может быть полезен, особенно при работе с кодом у людей, которые любят захватывать все общие типы.
Ответ 3
try
{
// Some code
}
catch (Web2PDFException ex)
{
// It your special exception
}
catch (Exception ex)
{
// Any other exception here
}
Ответ 4
try
{
}
catch (Exception err)
{
if (err is Web2PDFException)
DoWhatever();
}
но, вероятно, лучший способ сделать то, что вам нужно.
Ответ 5
Вместо жесткого кодирования и перекомпиляции, почему бы просто не вызвать метод GetType
от фактического исключения с помощью отладчика Visual Studio?
Для этого во время отладки можно вызвать методы с помощью Immediate Window
отладчика. Например, мне нужно было знать, что такое исключение, и просто извлечь свойство Name
GetType
как таковое, не перекомпилируя:
![введите описание изображения здесь]()
Ответ 6
Вы всегда должны улавливать исключения как можно более конкретные, поэтому вы должны использовать
try
{
//code
}
catch (Web2PDFException ex)
{
//Handle the exception here
}
Вы, конечно, можете использовать что-то вроде этого, если вы настаиваете:
try
{
}
catch (Exception err)
{
if (err is Web2PDFException)
{
//Code
}
}
Ответ 7
вы можете добавить дополнительную информацию к своему исключению в своем классе, а затем, когда вы поймаете исключение, вы можете управлять своей персонализированной информацией, чтобы идентифицировать свое исключение.
this.Data["mykey"]="keyvalue"; //you can add any type of data if you want
а затем вы можете получить свое значение
string mystr = (string) err.Data["mykey"];
для получения дополнительной информации:
http://msdn.microsoft.com/en-us/library/system.exception.data.aspx
Ответ 8
В качестве альтернативы:
var exception = err as Web2PDFException;
if ( excecption != null )
{
Web2PDFException wex = exception;
....
}