C#. Странное поведение при перебрасывании исключения
Во время исследования журнала исключений я столкнулся со странным поведением для callstack исключения при использовании throw;
за повторное выбрасывание пойманного исключения.
Например
string callstack1, callstack2;
try
{
try
{
// some code throwing exception
}
catch (Exception ex1)
{
// deal with exception
callstack1 = ex1.StackTrace;
throw;
}
}
catch (Exception ex2)
{
// handle exception
callstack2 = ex2.StackTrace;
}
В этом примере я ожидал того же значения для callstack1
а также callstack2
переменные. Но сохраненная информация стека вызовов указала мне на throw;
инструкция внутри catch
блок. Можно ожидать поведения, если я использую throw ex1;
Но я не
Я использовал один и тот же простой код для проверки этого поведения на двух удаленных компьютерах, но я получил разные результаты. Первый работает как положено (тот же стек вызовов для оригинального и повторного исключения). Второй отображает совершенно другой callstack для исключения re-throw, поэтому нет никакой возможности получить оригинальную трассировку стека.
Кто-нибудь сталкивался с этой проблемой раньше?
И главный вопрос - как сохранить исходный callstack при повторном вызове исключения?
Заранее спасибо!