Бувають ситуації, коли ви можете їх використовувати, але вони повинні бути дуже рідкісними. Ситуації, в яких я можу використовувати один, включають:
ведення журналу виключень; залежно від контексту, ви можете замість цього розмістити необроблений виняток або повідомлення.
циклічні технічні ситуації, такі як візуалізація чи обробка звуку або зворотний виклик списку, де сама поведінка продемонструє проблему, кидання винятку просто перешкодить, а реєстрація винятку, ймовірно, призведе до 1000-ти повідомлень "не вдалося XXX" .
програми, які не можуть вийти з ладу, хоча вони все одно повинні хоч щось записувати.
Для більшості додатків winforms я виявив, що достатньо мати одну заяву спробу для кожного вводу користувача. Я використовую такі методи: (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, що може бути краще для надання дзвінків, щоб виняток не генерував нескінченну кількість повідомлень.