Вместо использования логического флага я буду хранить ссылку на объект Exception.
Таким образом, у вас есть не только способ проверить, произошло ли исключение (объект будет нулевым, если не возникло исключение), но вы также получите доступ к самому объекту исключения в вашем блоке finally, если исключение действительно произошло. Вам просто нужно помнить, чтобы установить объект ошибки во всех ваших блоках перехвата (если вы сбросите ошибку).
Я думаю, что это недостающая возможность языка C #, которую нужно добавить. Блок finally должен поддерживать ссылку на базовый класс Exception, аналогично тому, как его поддерживает блок catch, так что ссылка на распространяющееся исключение доступно для блока finally. Это будет простой задачей для компилятора , , сохраняющей нам работу из вручную создание локальной переменной Exception и запоминание для установки вручную его значение перед повторной выдачей ошибки, а также предотвращает совершение ошибки установки переменной Exception, когда повторная ошибка не выдается (помните, что мы хотим сделать видимыми только неперехваченные исключения блок finally).
finally (Exception main_exception)
{
try
{
//cleanup that may throw an error (absolutely unpredictably)
}
catch (Exception err)
{
//Instead of throwing another error,
//just add data to main exception mentioning that an error occurred in the finally block!
main_exception.Data.Add( "finally_error", err );
//main exception propagates from finally block normally, with additional data
}
}
Как показано выше ... причина, по которой я хотел бы, чтобы исключение было доступно в блоке finally, заключается в том, что если мой блок finally действительно перехватил собственное исключение, то вместо перезаписывается основное исключение с помощью броска новая ошибка (плохая) или просто , игнорируя ошибку (также плохая) , это может добавить ошибку в качестве дополнительных данных к исходной ошибке.