Подтвердить что ты не робот

Идентификация типа исключения в обработчике

Я создал собственный класс исключений

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

В моем приложении я хочу выяснить, исключение throw - это мое обычное исключение или нет.

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

Ответ 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; 
     .... 
}