Разница между throw и throw ex в C#

В C# ключевое слово throw используется для генерации исключений. Однако его можно применять двумя разными способами: throw и throw ex. Хотя они выглядят схоже, их поведение различается, особенно в контексте сохранения стека вызовов.

Использование throw

При использовании throw без указания переменной исключения сохраняется оригинальный стек вызовов. Это помогает точно определить место возникновения ошибки.

Пример:

try
{
    throw new Exception("Ошибка произошла");
}
catch (Exception ex)
{
    throw;
}

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

Использование throw ex

При использовании throw ex создаётся новая точка отсчёта стека вызовов, из-за чего теряется информация о первоначальном месте возникновения ошибки.

Пример:

try
{
    throw new Exception("Ошибка произошла");
}
catch (Exception ex)
{
    throw ex;
}

В этом случае информация о том, где именно возникло исключение, будет утеряна, и в трассировке стека оно будет отображаться как возникшее в строке throw ex;, а не в оригинальном месте.


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