ОБНОВЛЕНИЕ, май 2021 г. - Когда я изначально задал этот вопрос, основная вещь, которая сделала этот вопрос актуальным (для меня), заключалась в том, что при повторном генерировании исключения из улова через простой throw
(сам по себе) исходный стек исключений был потерян. Так что это сделано с помощью улова, чтобы определить, было ли исключено исключение.
Это некорректное поведение потери стека было исправлено где-то между заданием вопроса (2017 г.) и сейчас. Таким образом, простой захват и повторное создание (вызов throw
без других аргументов) теперь является наиболее простым способом обнаружения исключения, которое было сгенерировано из блока finally
. Спасибо @JohnLBevan за его ответ, который дал мне понять, что повторный выброс из улова больше не является проблемой.
ОРИГИНАЛЬНЫЙ ВОПРОС:
У меня такой код структурирован
try{
...
}
finally{
...
<code that may throw>
}
Конечно, обычно следует избегать кода, который вызывает файл finally. Но такое бывает. И когда это происходит, одним неприятным побочным эффектом является потеря исходного исключения. Итак, первое, что я хотел бы сделать в finally, - это записать информацию об исключении, сгенерированном при попытке, если оно было сгенерировано.
Но как я могу определить, возникло ли исключение в блоке try, когда я нахожусь в окончательном? Есть хитрый способ? Я не хочу перехватывать исключение в уловке. Я могу установить логическое значение в конце попытки, которое указывало бы на то, что исключение не было сгенерировано, но я не большой поклонник необходимости делать это каждый раз. Это выглядело бы так:
$exceptionThrown = $true
try{
...
$exceptionThrown = $false
}
finally{
<if $exceptionThrown log info about it>
...
<code that may throw>
}
Могу я сделать лучше?
throw
вcatch
приведет к потере исходной трассировки стека. Но комментарий к ответу на вопрос на странице stackoverflow.com/questions/13820140 указывает на то, что в какой-то момент это было исправлено. Я только что попробовал в Windows 10 1909, и сейчас он действительно работает нормально. Это отличные новости. 12.05.2021