Мысли о блоках try-catch

Что вы думаете о коде, который выглядит так:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        throw;
    }
}

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

Итак, мой вопрос, почему это было бы хорошо?

---- EDIT ----

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

Ответ 1

В зависимости от того, какое качество вы смотрите, оно не выбрасывает исключение в другом месте. "Бросок" без цели повторяет исключение, которое сильно отличается от того, чтобы выбрасывать исключение. В первую очередь ретрол не reset трассировки стека.

В этом конкретном примере улов бессмыслен, потому что он ничего не делает. Исключение счастливо возрождается, и почти так, как будто try/catch не существует.

Ответ 2

Я думаю, что конструкция должна использоваться для обработки исключений, которые, как вы знаете, вы будете бросать в свой код; если возникает другое исключение, тогда просто снимите.

Учтите, что бросить; отличается от throw ex;

throw ex будет усекать стек до новой точки бросания, потеряв ценную информацию об исключении.

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (EspecificException ex)
    {
        HandleException(ex);
    }
    catch (Exception ex)
    {
        throw;
    }
}

Ответ 3

Это не так, в идеале блок catch будет выполнять некоторую обработку, а затем ретронировать, например,

try
{
    //do something
}
catch (Exception ex)
{
    DoSomething(ex); //handle the exception
    throw;
}

Конечно, повторный бросок будет полезен, если вы хотите сделать некоторую дополнительную обработку в верхних ярусах кода.

Ответ 4

Делать что-то подобное довольно бессмысленно, и в целом я стараюсь не идти по пути бессмысленных вещей;)

По большей части я верю в улавливание определенных типов исключений, которые вы знаете, как обрабатывать, даже если это означает только создание собственного исключения с большей информацией и использование исключенного catch как InnerException.

Ответ 5

Иногда это подходит - когда вы собираетесь обрабатывать исключение выше в стеке вызовов. Тем не менее, вам нужно будет что-то сделать в этом блоке catch, кроме как для повторного броска, чтобы это имело смысл, например. запишите ошибку:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        LogException (ex);  // Log error...
        throw;
    }
}

Ответ 6

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

Разница между тем и тем, что вы говорите, заключается в том, что эти пользовательские объекты Exception хранят БОЛЬШУЮ информацию о фактическом исключении, которое произошло, и не менее.

Ответ 7

Ну для начала я просто делал

catch
{
   throw;
}

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

например.

catch(SQLException sex) //haha
{
   DoStuff(sex);
}
catch
{
   throw;
}

Ответ 8

В зависимости от того, что вы подразумеваете под "выглядит так", и если в блоке catch нет ничего другого, кроме повтора... если в этом случае попытка catch поймает бессмысленно, за исключением, как вы говорите, обфускации произошло исключение. Но если вам нужно что-то сделать там, где произошла ошибка, но вы хотите обработать исключение из стека, это может быть уместно. Но тогда улов будет за конкретное исключение, которое вы используете, а не за любое исключение

Ответ 9

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

Я думаю, было бы лучше на самом деле что-то сделать в catch.

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

Ответ 10

Как правило, с блоками обработки исключений, которые ничего не делают, это не очень хорошо, по той простой причине, что он запрещает виртуальной машине .Net создавать свои методы при оптимизации производительности вашего кода.

Для полной статьи о том, почему см. " Release НЕ отлаживается: 64-битные оптимизации и метод С# Вложение в выпуске сборки стеков вызовов" by Скотт Гензельман