Вопрос по c# – Поймать против Поймать (исключение е) и бросить против броска е

23

Являются ли эти два примера кода одинаковыми?Catch а такжеCatch (Exception e) имеют одинаковый вывод, и результат также тот же, если я пишуThrow или жеThrow e.

Главный:

try
{
    A();
    //B();
}
catch (Exception e)
{
    Console.WriteLine("{0} exception caught.", e);
}

Код 1:

static void A()
{
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch (Exception e)
    {
        throw e;
    }
}

Код 2:

static void A()
{
    // Rethrow syntax.
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch
    {
        throw;
    }
}
@MarcGravell - Марк да, если онthrows e есть разница. JonH
Какой смыслthrow e, как вы бросаете исключение, но с отсутствующей полезной частью stacktrace Chris S
Error: User Rate Limit Exceeded Jeshurun
Оба одинаковы, потому что выthrow. JonH
Error: User Rate Limit Exceeded Jeshurun

Ваш Ответ

2   ответа
33

Error: User Rate Limit Exceededpractical разница между

catch {...}

а также

catch(Exception ex) {...}

Error: User Rate Limit ExceededExceptionError: User Rate Limit ExceededanythingError: User Rate Limit ExceededhadError: User Rate Limit ExceededcatchError: User Rate Limit Exceeded(Exception ex)Error: User Rate Limit ExceededstringError: User Rate Limit ExceededExceptionError: User Rate Limit Exceeded

Error: User Rate Limit Exceededthrow; противthrow ex;Error: User Rate Limit ExceededthrowError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
52

What is the difference between throw and throw e;?

Я не думаю, что когда-либо есть веская причина писатьcatch (Exception e) { throw e; }, Это теряет оригинальную трассировку стека. Когда вы используетеthrow; оригинальная трассировка стека сохраняется. Это хорошо, потому что это означает, что причину ошибки легче найти.

What is the difference between catch and catch (Exception e)?

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

The variable 'e' is declared but never used

try
{
    int value = 1 / int.Parse("0");
}
catch (Exception e)
{
    LogException(e);
    throw;
}

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

Error: User Rate Limit Exceeded a1204773
Error: User Rate Limit ExceededshouldError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы