Что вы думаете о следующем. Вместо того, чтобы рассматривать проблему как «Как получить последнее исключение?», Что если вы измените его на «Как запустить какой-то фрагмент кода с дополнительным контролем?»
Например:
Вместо ExceptionHelper у вас может быть ActionRunner.
public class ActionRunner
{
public Action AttemptAction { get; set; }
public Action SuccessfulAction { get; set; }
public Action ExceptionAction { get; set; }
public void RunAction()
{
try
{
AttemptAction();
SuccessfulAction();
}
catch (Exception ex)
{
LogException(ex);
ExceptionAction();
}
}
private void LogException(Exception thrownException) { /* log here... */ }
}
По крайней мере, это даст вам некоторое повторное использование SuccessfulAction и ExceptionAction, если только между AttemptAction будет различаться вызов.
var actionRunner = new ActionRunner
{
AttemptAction = () =>
{
Console.WriteLine("Going to throw...");
throw new Exception("Just throwing");
},
ExceptionAction = () => Console.WriteLine("ExceptionAction"),
SuccessfulAction = () => Console.WriteLine("SuccessfulAction"),
};
actionRunner.RunAction();
actionRunner.AttemptAction = () => Console.WriteLine("Running some other code...");
actionRunner.RunAction();