我正在为第三方函数库开发一个包装器,它与一些特殊硬件连接.所以基本上,我想封装DLL函数(bool Connect()
,void Disconnect()
与连接-和断开连接方法在MyHardwareObject等).
来自dll的Connect函数可以抛出一些特定的异常,例如当硬件不存在时.对于应用程序,有关connect方法失败原因的信息被认为是不重要的,因此不需要包含在异常中的附加信息.
处理这些异常,返回false
或在此处未处理的异常的最佳方法是什么,并将其捕获到否则会处理connect方法返回的事实的级别false
?
bool MyHardwareObject.Connect() { try { ThirdPartyLibrary.Connect(); } catch (SomeException) { return false; } return true; }
相反
bool MyHardwareObject.Connect() { ThirdPartyLibrary.Connect(); return true; }
(或者在第二种情况下更好void MyHardwareObject.Connect()
,因为我们要么返回true,要么抛出异常?)
或者你还会做什么?最重要的是:为什么?
在我看来,第一种情况肯定比第二种情况好.您希望您的硬件库以一种您的用户无需确切知道其中的内容的方式环绕第三方库.
如果您在错误处理中需要更多详细信息,除了true或false之外,您可以考虑重新抛出自己的异常,将异常从第三方库转换为与您自己的代码更一致的内容.
在例外和返回代码之间明智地选择是非常困难的.这取决于很多事情,以及如何在代码库的其余部分处理错误将是最重要的 - 保持一致.
最近,我更倾向于"如果它不值得,就不要抛出异常".我们的异常做了很多工作:它们记录东西,它们创建堆栈跟踪等.如果我只想将字符串转换为整数,如果输入字符串格式错误则抛出异常可能不值得.另一方面,如果无法使用正确的数据构造,我在系统中根本不需要这些对象,在这种情况下,它们的构造函数会抛出异常.
如果代码库的其余部分没有给你任何关于如何做的提示,我喜欢这个经验法则:想象一下,抛出异常会让你的计算机发出响亮的哔哔声.只要你忍受它,投掷是好的.
我会传递例外情况.如果不这样做,您将掩盖可能在以后有用的重要信息.我知道您现在没有使用它,但如果您决定将来根据错误类型以不同方式处理恢复,该怎么办?此时,您必须撤消已编写的所有代码以屏蔽异常.虽然我不同意@MadKeithV使其成为真/假,但我认为他有一个重点在你自己的异常中包装异常,这可能会为你的应用程序提供更好的语义.
请阅读:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html
简而言之:
调用者是否对返回值有用?它可以恢复或是世界末日的错误吗?如果这只是一个小问题,请使用返回码.如果各种状态经常发生(50%的失败时间,50%失效),请使用返回码,因为调用者无论如何都必须处理这种情况,并且异常无济于事.
你想传递更多的信息(比如设置第三方的东西,所以有人有机会调试后来发生的事情)?使用例外.