Есть ситуации, когда вы можете их использовать, но они должны быть очень редкими. Ситуации, где я мог бы использовать один из них:
регистрация исключений; в зависимости от контекста вы можете захотеть разместить необработанное исключение или сообщение.
зацикливание технических ситуаций, таких как рендеринг или обработка звука, или обратный вызов списка, когда само поведение будет демонстрировать проблему, выбрасывание исключения будет только мешать, а регистрация исключения, вероятно, просто приведет к тысячам сообщений «fail to XXX» ,
программы, которые не могут потерпеть неудачу, хотя они должны хотя бы что-то регистрировать.
я обнаружил, что для большинства приложений winforms достаточно иметь один оператор try для каждого пользовательского ввода. Я использую следующие методы: (AlertBox - просто быстрая оболочка MessageBox.Show)
public static bool TryAction(Action pAction)
{
try { pAction(); return true; }
catch (Exception exception)
{
LogException(exception);
return false;
}
}
public static bool TryActionQuietly(Action pAction)
{
try { pAction(); return true; }
catch(Exception exception)
{
LogExceptionQuietly(exception);
return false;
}
}
public static void LogException(Exception pException)
{
try
{
AlertBox(pException, true);
LogExceptionQuietly(pException);
}
catch { }
}
public static void LogExceptionQuietly(Exception pException)
{
try { Debug.WriteLine("Exception: {0}", pException.Message); } catch { }
}
Тогда каждый обработчик события может сделать что-то вроде:
private void mCloseToolStripMenuItem_Click(object pSender, EventArgs pEventArgs)
{
EditorDefines.TryAction(Dispose);
}
или
private void MainForm_Paint(object pSender, PaintEventArgs pEventArgs)
{
EditorDefines.TryActionQuietly(() => Render(pEventArgs));
}
Теоретически, вы можете использовать TryActionSilently, который может быть лучше для рендеринга вызовов, чтобы исключение не создавало бесконечное количество сообщений.