Захват определенных исключений (от третьих лиц) без сопоставления строк - PullRequest
2 голосов
/ 30 июля 2010

Я неоднократно оказывался в ситуациях, когда я хочу перехватить исключение (в .net), но может быть несколько исключений с разными сообщениями, которые я хочу обрабатывать по-разному.

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

Это утомительно и кажется неправильным. Я упускаю какой-то хороший способ уникальной идентификации исключений без сравнения строк? Или мне просто довелось работать с некоторыми плохими библиотеками, которые не генерируют исключения с хорошими метаданными? (Примеры до сих пор включали ADODB и OpenNETCF).

псевдокод, объясняющий, что я описываю:

Try
...
Catch myexception as System.Runtime.InteropServices.COMException
   switch(myexception.message){
      case "oneexceptionmessage":
         handleOneException()
      case "twoexceptionmessage":
         handleTwoException()
   }
End Try

End Try

  • Типы исключений разные
  • Внутренние исключения равны нулю
  • HR-результаты могут отличаться, но обычно недоступны в качестве защищенных свойств

Ответы [ 4 ]

1 голос
/ 30 июля 2010

Вы, возможно, захотите последовать совету Скотта и в любом случае создать свой собственный набор классов исключений (основываясь на ваших наблюдениях за тем, что выдают библиотеки), особенно если мы говорим о большом приложении (или наборе их), которое все используютэти библиотеки.

Я предлагаю своего рода класс фабрики исключений, который инкапсулирует все «утомительные / неправильные» сравнения строк и генерирует ваши собственные исключения для вызывающего кода для обработки или повторного выброса.Это потребует от обработчиков исключений в вашем вызывающем коде передачи исключений, которые они перехватывают на фабрику, чтобы получить более полезный результат.Может быть излишним, но по крайней мере вы пишете сравнения строк только один раз, в одном месте ...

0 голосов
/ 30 июля 2010

Хотя я не видел его в отладчике, я просмотрел документацию для портативной библиотеки , которую мы используем, и увидел свойство HResult. Теперь я вижу, что могу сослаться на это и для исключений в базе данных.

Я раньше этого не замечал, потому что просто просматривал значения в отладчике, а его там не было.

Может быть, они всегда уникальны?

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

0 голосов
/ 30 июля 2010

Разместите несколько операторов catch по порядку от самых специфических к наименее специфичным

Try

Catch dboe as DivideByZeroException

Catch oome as OutOfMemoryException

Catch ...

Catch e as Exception

End Try
0 голосов
/ 30 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...