Почему stacktrace изменяется, когда вы используете throw в C#?

Возможный дубликат:
неверная трассировка стека при повторном броске

Привет,

до сих пор думал что занимаюсь

int a = 10/0;

создаст то же исключение, что и

try
{
    int a = 10/0;
}
catch
{
    throw;
}

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

Это информация MSDN:

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

Это действительно ожидаемое поведение или это ошибка.Net или что? Как я могу сохранить НАСТОЯЩУЮ трассировку стека? Я мог бы создать новое исключение, поместив ex в качестве InnerException, но это:

  • Некрасиво.
  • Longer.
  • Делает вам выбор для исключения.

0 ответов

Другие вопросы по тегам