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

Являются ли эти два примера кода одинаковыми?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;
    }
}
 Jeshurun29 мая 2012 г., 22:15
Понятно, я просто хотел пометить, но вижу, что об этом уже позаботились!
 JonH29 мая 2012 г., 22:12
И то же самое, потому что тыthrow.
 Chris S29 мая 2012 г., 22:16
Какой смыслthrow e, когда вы выкидываете исключение, но с отсутствующей полезной частью stacktrace
 Jeshurun29 мая 2012 г., 22:14
Что это за язык
 JonH29 мая 2012 г., 22:15
@ MarcGravell - Марк да, если онthrows e есть разница

Ответы на вопрос(2)

Решение Вопроса

В чем разница междуthrow а такжеthrow e;?

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

В чем разница междуcatch а такжеcatch (Exception e)?

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

Переменная 'e' объявлена, но никогда не используется

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

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

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

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

 Chris S29 мая 2012 г., 23:01
Catch () тоже ловит неуправляемые исключения
 a120477329 мая 2012 г., 22:22
Я обновил код, я просто хотел знать, имеет ли смысл писать Exception e / Throw e, потому что результат тот же ..
 Jeppe Stig Nielsen27 июн. 2012 г., 16:20
Также можно указать тип исключения для перехвата, не вводя локальную переменную (которая, как жалуется компилятор, никогда не используется). Вы просто говорите:catch (ArithmeticException) { ... }
 Mark Byers29 мая 2012 г., 22:25
@ Loclip: Если вы не хотите потерять трассировку стека, и если вы не хотите получать предупреждения компилятора при компиляции кода (и выдолже заботиться об этих вещах) тогда да, это имеет значение.

то единственный раз, когда появляется Практической разница межд

catch {...}

а такж

catch(Exception ex) {...}

это когда какой-то не-C # код выбрасывает не-Exception исключение. C ++ может броситьчто-нибуд. В .NET 1.1 выбыл использоватьcatch (нет(Exception ex)) для обработки этих необычных исключений. Однако это было проблематично - не в последнюю очередь, вы не можете видеть, что было брошено! Таким образом, в .NET 2.0 и выше это переносится по умолчанию, так что даже если C ++ выдает, скажем,string - вы видите это какException подкласс. Обратите внимание, что это можно отключить с помощью параметра конфигурации, но: нет. Забудь об этом

Вопросthrow; противthrow ex; уже упоминается и относится к трассировке стека. Вы можете использоватьthrow в обоих случаях, сохраняя исходную трассировку стека.

 ORcoder21 февр. 2018 г., 17:24
Еще одна практическая проблема - если у меня не будет «catch (Exception ex) {...}», тогда я не буду знать, что такое исключение при отладке. Если я не ошибаюсь и есть способ увидеть исключение в пустых операторах "catch {..}" ...
 Lukazoid10 апр. 2015 г., 11:45
У вас есть ссылка для получения дополнительной информации об этом параметре конфигурации? Или, если вы не хотите испытывать судьбу, связав ее здесь, могу я отправить вам сообщение в твиттере? В настоящее время я не могу найти больше информации об этом.

Ваш ответ на вопрос