Exception.Data и вопросы обработки исключений - PullRequest
2 голосов
/ 11 сентября 2009

У меня есть пара вопросов об исключениях.

1) когда вы попадаете в ловушку, глотание означает что именно? Я думал, что это всегда повторная выдача или существующие исключения передаются в следующий блок catch.

2) Если вы добавляете значения Exception.Data к исключению, я замечаю, что должен сделать еще один бросок; чтобы получить эти данные позже в другом блоке catch. Почему?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2009

Поглотить исключение означает поймать его и не делать с ним ничего полезного. Общее, что вы можете увидеть, это:

try
{
     DoSomeOperationThatMightThrow();
}
catch (Exception ex) // don't do this!
{
     // exception swallowed
}

Обычно вы вообще не хотите перехватывать базовое исключение, лучше ловить и обрабатывать определенные типы исключений, и в идеале вы должны ловить только те типы исключений, с которыми вы можете сделать что-то полезное на уровне кода, который вы в. Это может быть сложно в сложных приложениях, потому что вы можете обрабатывать разные ошибки на разных уровнях в коде. Самый высокий уровень кода может просто перехватывать серьезные / фатальные исключения, а более низкие уровни могут перехватывать исключения, с которыми можно справиться при помощи некоторой логики обработки ошибок.

Если вы поймали исключение и хотите его сбросить, сделайте следующее:

try
{
     DoSomething();
}
catch (SomeException ex)
{
     HandleError(...);

     // rethrow the exception you caught
     throw;

     // Or wrap the exception in another type that can be handled higher up.
     // Set ex as the InnerException on the new one you're throwing, so it
     // can be viewed at a higher level.
     //throw new HigherLevelException(ex);

     // Don't do this, it will reset the StackTrace on ex,
     // which makes it harder to    track down the root issue
     //throw ex;
}
2 голосов
/ 11 сентября 2009
  1. Проглатывание исключения обычно означает наличие блока обработки для исключения, но ничего не делает в блоке. Например:

    try {3/0; } catch DivideByZeroException {// ignore} // Примечание: я знаю, что компиляция действительно не получится, потому что компилятор достаточно умен, чтобы не делить на const 0.

  2. Вы должны перебросить, потому что первый обработчик для исключения является единственным, который будет выполняться.

Если вы хотите, чтобы исключение вспыхнуло, вы либо не обрабатываете его, либо перебрасываете его. Кстати, важно отметить, что в .NET, просто сказав «throw», вы сохраните трассировку стека. Если вы «выбросите исключение», вы потеряете свой след стека.

1 голос
/ 11 сентября 2009

Хорошо, вы можете обработать исключение вплоть до стека вызовов, вы можете сделать что-то вроде этого:


    public class A
    {
        public void methodA()
        {
            try
            {
            }
            catch(Exception e)
            {
                 throw new Exception("Some description", e);
            }
        }
    }

    public class B
    {
        public void methodB()
        {
            try
            {
                 A a = new A();
                 a.methodA();
            }
            catch(Exception e)
            {
                //...here you get exceptions
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...