Проблема обработки исключений - PullRequest
1 голос
/ 17 марта 2009

Я пытаюсь написать некоторый код, который перехватывает конкретное исключение и выбрасывает более полезный код для чего-то более высокого в стеке вызовов, но также для перехвата более общих исключений и их обработки.

Код выглядит примерно так:

try
{
    // Do stuff
}
catch (SomeException e)
{
    throw new SomeExceptionWithContextInfo();
}
catch (Exception e)
{
    // Handle unexpected exception gracefully
}

Проблема, с которой я столкнулся, заключается в том, что общим исключением является перехват моего нового исключения. Есть ли способ избежать этого?

Мое текущее решение заключается в проверке типа исключения и повторном его вызове, если я только что создал его тип.

Ответы [ 4 ]

6 голосов
/ 17 марта 2009

Код, который вы разместили, должен работать, как показано в этом тестовом приложении:

using System;

class OtherException : Exception {}

class Test
{
    static void Main(string[] args)
    {
        try
        {
            Foo();
        }
        catch (OtherException)
        {
            Console.WriteLine("Caught OtherException");
        }
    }

    static void Foo()
    {
        try
        {
            string x = null;
            int y = x.Length;
        }
        catch (NullReferenceException)
        {
            throw new OtherException();
        }
        catch (Exception)
        {
            Console.WriteLine("Caught plain Exception");
        }
    }
}

Это просто печатает "Caught OtherException", а не "Caught plain Exception". Вы уверены, что в вашем реальном коде нет вложенного блока try? Не могли бы вы опубликовать короткий, но полный пример, который показывает вашу проблему?

Вам действительно нужно поймать Exception в вашем методе? Это очень редко хорошая идея.

2 голосов
/ 17 марта 2009

Вы делаете это правильно. Общее исключение не будет поймать конкретное.

2 голосов
/ 17 марта 2009

Код, который вы разместили, - это способ сделать это (сначала нужно указать catch для более конкретного исключения).

Я предлагаю еще раз взглянуть на код, так как либо они не в том порядке, либо код фактически не выдает этот тип исключения.

Вот ссылка на msdn о try-catch: http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx

0 голосов
/ 17 марта 2009

Не поймать общие исключения, может быть ответ? Узнайте, какие исключения могут быть выброшены, и поймайте их отдельно.

try { // Outer try/catch
    DoSomething();

    try {
        /* */
    } catch(NotGeneralException e) {
        /* */
    } catch(AnotherNotGeneralException e) {
        throw new SomeOtherException("Exception message");
    }
} catch(SomeOtherException e) {
    /* */
}

В качестве альтернативы можно перехватить только общее исключение и повторно вызвать SomeOtherExcepion

try {

} catch(Exception e) {
    throw new SomeOtherException("Exception message");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...