Передача исключения из конкретного улова в менее конкретный улов - PullRequest
0 голосов
/ 04 марта 2010

В настоящее время я использую два блока catch после блока try. Первый ловит SqlExceptions, второй Exception. Если у SqlException нет определенного сообщения, я хочу, чтобы оно обрабатывалось общим блоком catch. Есть ли способ передать исключение из первого блока catch во второй, или мне нужно продублировать код?

Ответы [ 3 ]

2 голосов
/ 04 марта 2010

Прежде всего вы должны спросить себя, действительно ли вы хотите поймать Exception. Если вы не можете обработать исключение, вы не должны его ловить.

Если вы хотите перехватить универсальное исключение и разделить какую-то обработку между вашими блоками перехвата, дублирование кода не является правильным подходом. Почему бы не инкапсулировать обработку в метод и не вызывать ее из обоих блоков?

1 голос
/ 04 марта 2010

Если предположить, что операторы Catch не являются вложенными, этот код работает в VB.Net:

.
Try
    SomeCode()
Catch ex As ArgumentException When ex.Message <> ""
    Trace.WriteLine(String.Format("Caught argument exception with a message {0}", ex.Message))
Catch ex As Exception
    Trace.WriteLine("Caught argument exception with no message, or some other type of exception")
End Try

если SomeCode выбрасывает ArgumentExeption с сообщением (например, ArgumentException, созданный с помощью пустого конструктора), оно будет обработано первым оператором Catch. Все остальные исключения будут обрабатываться вторым оператором Catch, включая ArgumentException с пустым сообщением.

Я предполагаю, что если VB.NET может это сделать, то C # может (но предположение может быть ужасно неверным).

РЕДАКТИРОВАТЬ: Кажется, что нет эквивалентной структуры кода в C #, как спрашивается здесь . Извините, если я вводил в заблуждение.

1 голос
/ 04 марта 2010

В этом случае вам придется продублировать код.

Вы не можете выбросить исключение в нижний блок перехвата, хотя вы можете перебросить его в блок исключения и позволить вызывающей функции обработать его.

...