Это любопытная проблема.
Код, который вы разместили , должен работать. Кажется, что происходит какая-то оптимизация, которая решает не вызывать ваш обработчик catch.
Итак, я хотел обнаружить исключение с помощью этого:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = false;
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
(Мой настоящий код только что спал в этом критическом разделе кода, поэтому я мог быть уверен, что он наконец прекратит работу.)
напечатано:
Тема прервана? Ложные
Хммм, действительно странно!
Так что я подумал о том, чтобы сделать немного больше работы, чтобы обмануть любую «умную» оптимизацию:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = AmIEvil();
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
Где AmIEvil
просто:
[MethodImpl(MethodImplOptions.NoInlining)]
static bool AmIEvil() {
return false;
}
Наконец напечатано:
Тема прервана? Правда
И вот оно у вас есть. Используйте это в своем коде:
try {
try { }
finally { /* critical code */ }
NoOp();
}
catch (Exception ex) {
// ThreadAbortException is caught here now!
}
Где NoOp
просто:
[MethodImpl(MethodImplOptions.NoInlining)]
static void NoOp() { }