我一再发现自己处于需要捕获异常的情况(在.net中),但可能存在多个异常,我想要以不同的方式处理不同的消息。
当我在调试器中查看异常时,我通常找不到任何显示代表该特定异常的唯一编号的元数据,因此我最终编写了字符串比较。异常类是相同的。
这很乏味,似乎错了。在没有进行字符串比较的情况下,我是否遗漏了一些唯一识别异常的方法或者我是否碰巧使用了一些不会抛出具有良好元数据的异常的坏库? (到目前为止的例子包括ADODB和OpenNETCF)。
伪代码解释我在描述的内容:
Try
...
Catch myexception as System.Runtime.InteropServices.COMException
switch(myexception.message){
case "oneexceptionmessage":
handleOneException()
case "twoexceptionmessage":
handleTwoException()
}
End Try
结束尝试
答案 0 :(得分:1)
你可能希望遵循Scott的建议并创建你自己的一组异常类(基于你对库的投射的观察),特别是如果我们正在谈论一个大的应用程序(或它们的集合),所有使用那些图书馆。
我建议使用一种异常工厂类,它封装了所有“繁琐/错误”的字符串比较,并为调用代码生成适当的异常,以便处理或重新抛出。这将要求调用代码中的异常处理程序将它们捕获的异常传递给工厂,以获得更有用的结果。可能有点矫枉过正,但至少你只能在一个地方写一次字符串比较......
答案 1 :(得分:0)
OOP的处理方式不是使用异常类的消息,而是建议您创建一个子类来表示每个异常情况。这种方式最重要的是,强类型,并且不会进行字符串比较。
答案 2 :(得分:0)
虽然我没有在调试器中看到它,但我查看了我们使用的handheld library的文档,并看到了HResult属性。我现在看到我也可以为数据库的getxceptions引用它。
之前我没有注意到它,因为我只是在调试器中浏览值,而且它不存在。
也许这些总是独一无二的?
这就是the documentation描述这个属性的使用方式 - 我不清楚是否强制执行任何Subclass of Exception总是强制执行此属性。
答案 3 :(得分:-1)
从最具体到最不具体的
按顺序放置多个catch语句Try
Catch dboe as DivideByZeroException
Catch oome as OutOfMemoryException
Catch ...
Catch e as Exception
End Try