При обычном перебрасывании сохраняется все в трассировке стека, за исключением того, что если текущий метод находится в трассировке стека, номер строки будет перезаписан. Это раздражающее поведение. В C #, если нужно что-то сделать в исключительном случае, но не волнует, что это за исключение, можно использовать шаблон:
Boolean ok = False;
try
{
do_something();
ok = True;
}
finally
{
if (!ok) // An exception occurred!
handle_exception();
}
Есть ряд, где этот шаблон очень полезен; наиболее распространенной будет функция, которая должна возвращать новый IDisposable. Если функция не вернется, одноразовый предмет должен быть очищен. Обратите внимание, что любые операторы "return" в указанном выше блоке "try" должны иметь значение ok, равное true .
В vb.net можно использовать шаблон, который функционально немного лучше, хотя одно место в коде немного странно с шаблоном:
Dim PendingException As Exception = Nothing;
Try
Do_Something
PendingException = Nothing ' See note
Catch Ex As Exception When CopyFirstParameterToSecondAndReturnFalse(Ex, PendingException )
Throw ' Will never execute, since above will return false
Finally
If PendingException IsNot Nothing Then
.. Handle exception
EndIf
End Try
Функция с длинным именем должна быть реализована очевидным образом. Этот шаблон имеет то преимущество, что делает исключение доступным для кода. Хотя это часто не требуется в ситуациях с обработкой, но не перехвата, есть одна ситуация, когда она может быть неоценимой: если процедура очистки выдает исключение. Обычно, если процедура очистки выдает исключение, любое ожидающее исключение будет потеряно. Однако с помощью приведенного выше шаблона можно обернуть ожидающее исключение в исключение очистки.
Одна интересная заметка с приведенным выше кодом: исключение может достигнуть «Catch When», но оператор Try может завершиться нормально. На самом деле не совсем ясно, что должно происходить в таких обстоятельствах, но ясно одно: утверждение «Окончание» не должно действовать так, как если бы исключение находилось на рассмотрении. Очистка PendingException сделает так, что если исключение исчезнет, код будет вести себя так, как будто этого никогда не было. В качестве альтернативы можно заключить в оболочку и выбросить исключение, о котором известно, что оно произошло, поскольку эта ситуация почти наверняка указывает на что-то не так с внутренним кодом обработки исключений.