Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Существует один ужасный взлом с участием Marshal.GetExceptionPointers
и Marshal.GetExceptionCode
, который не работает на всех платформах:
public static Boolean IsInException()
{
return Marshal.GetExceptionPointers() != IntPtr.Zero ||
Marshal.GetExceptionCode() != 0;
}
С этой страницы: http://www.codewrecks.com/blog/index.php/2008/07/25/detecting-if-finally-block-is-executing-for-an-manhandled-exception /
Я не могу придумать, почему вы не сделали бы это так:
private void Helper(bool exceptionWasCaught)
{
//...
}
Не то, что я знаю. Это громоздко, но он полностью определяет вас как намерение разработчика:
private bool inException = false;
public void MyFunc1()
{
try
{
inException = false;
// some code here that eventaully throws an exception
}
catch( Exception ex )
{
inException = true;
Helper();
}
}
public void MyFunc2()
{
inException = false;
Helper();
}
private void Helper()
{
// how can I check if program execution is the
// result of a thrown exception here.
if (inException)
{
// do things.
}
}
Я думаю, вы слишком задумываетесь об этом. Если у вас есть исключение, отправьте исключение. Если вы этого не сделаете, не делайте этого.
Почему бы вам не изменить подпись метода Helper ()?
public void MyFunc1()
{
try
{
// some code here that eventually throws an exception
}
catch( Exception ex )
{
Helper(ex);
}
}
private void Helper(Exception ex = null)
{
// result of a thrown exception here.
if (ex!=null)
{
// do things.
} else {
// do other things
}
}