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

Являются ли эти два примера кода одинаковыми?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;
    }
}

Ответы на вопрос(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 на самом деле не использует исключение, тогда вы захотите использовать вторую версию, чтобы избежать предупреждения компилятора.

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

catch {...}

а такж

catch(Exception ex) {...}

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

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

ВАШ ОТВЕТ НА ВОПРОС