Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Всё достаточно просто: выражение throw; в C# теряет стек исключения (вернее, просто генерирует его заново).throw; ничего не теряет. Вот если сделать throw e; где e — пойманное исключение, тогда да, стек заменится.
throw; всё же немного модифицируется, но в нём меняется только номер строки в пределах той функции, где было поймано исключение.static string _originalStrace;
static void Throw ()
{
throw new Exception ();
}
static void ThrowAndRethrow ()
{
try {
Throw ();
} catch (Exception e) {
_originalStrace = e.StackTrace;
throw;
}
}
public static void Main (string[] args)
{
try {
ThrowAndRethrow ();
} catch (Exception e) {
Console.WriteLine (e.StackTrace == _originalStrace);
}
}
at CSharpFilter.Program.Throw() in CSharpFilter\Program.cs:line 40 // throw new Exception();
at CSharpFilter.Program.ThrowAndRethrow() in CSharpFilter\Program.cs:line 46 // Throw();
at CSharpFilter.Program.Throw() in CSharpFilter\Program.cs:line 40 // throw new Exception();
at CSharpFilter.Program.ThrowAndRethrow() in CSharpFilter\Program.cs:line 52 // throw;
at CSharpFilter.Program.Main(String[] args) in CSharpFilter\Program.cs:line 59 // ThrowAndRethrow();
BeginExceptFilterBlock, конечно, в чем я сомневаюсь), что-нибудь типа MiniDump.Execute(() => { ... }) в топ левеле и чтобы процесс сам себя дампил, да дампами не пользуюсь вообще (процессы слишком жирные).
Фильтры исключений в CLR