对于我们在我工作的公司开发的软件,我们使用的第三方库是由我们经常联系的人开发的。他的代码是用C ++编写的,我们在项目中使用C#。
通常,他的库函数会返回错误代码。我决定使用不同的异常类来覆盖不同范围的错误代码。例如,一个参数处理错误的异常类,一个主操作错误的异常类,一个输入值错误的异常类等等。
他认为这不是一个好主意,并建议为库捕获所有错误使用一个异常类,然后从XML文件中提取错误代码并将问题输出给用户。他认为,编写多个异常类是没有意义的。并且他说他不能保证错误代码在不同版本的库中是相同的。
我认为拥有多个异常类是个好主意,因为:
我认为以一种我们可以不同方式处理不同类型的异常的方式开发程序是一个更好的主意。但是那个家伙比我有更多的经验,而且他在公司里有更多的可信度(我是一名新实习生)而且我对软件开发很陌生,我觉得他也许是对的,我只是在尝试添加额外的代码,因为它看起来很漂亮,违反了YAGNI原则。
你认为我们应该选择上一节课吗?如果您认为我们应该使用多个异常类,那么您的理由是什么?
答案 0 :(得分:1)
如果错误代码可以在不同版本之间发生变化,那么任何工作量(或缺少工作量)都不会让您无法在某些时候以某种方式重新映射这些错误。如果您有代码(或代码范围)的例外情况,那么当错误代码发生变化时,您将很难更多工作,而不会有更多工作(您将重新排列什么异常)如果你没有专门的类,就像抛出一个例外的消息一样被抛出。
此外,在一般实践中,通过.NET约定,您应该为BCL提供的异常未适当覆盖的特定异常创建专用异常类(不包括仅用于抽象的那些异常的使用)
对于某些Microsoft输入,请考虑this:
应用程序和库不应使用返回代码来传达错误。
this:
考虑抛弃驻留在系统中的现有异常 命名空间而不是创建自定义异常类型。
但是,遵循Exception Design Guidelines,
[将]帮助确保您使用现有的 适当的例外情况,并在它们之间创建新的例外 为你的图书馆增加价值。
坚持你的枪。
答案 1 :(得分:0)
带着他的号码的SqlException出现在我的脑海里。通过检查错误代码来捕获不同类型的错误是一种地狱。
答案 2 :(得分:0)
您绝对应该使用多个异常类。请注意,System
命名空间中已经有大量内置类,例如ArgumentNull
和朋友。
如果要查看未使用多个异常的情况,请查看COM互操作。这是一个黑暗的地方,抛出一般异常,他们的推理由一个整数HRESULT
证明。相信我,你不想重新创造它。
例如,只要您想捕获某个异常,就会有一个非常具体的用例。即。
try
{
lib.OpenFile(mypath);
}catch(FileNotFoundException e)
{
//handle gracefully and possibly "ignore" this error
}
如果找不到该文件,您需要执行其他操作。但是,如果OpenFile
因为mypath
为空而抛出异常,则您可能希望此异常冒泡并抛出错误。 (至少你可以记录它或其他东西)。使用单个异常类,这会变得更加痛苦
catch(MyException e)
{
if(e.Reason=10)
{
}else{
throw; //rethrow exception(which makes debugging more difficult)
}
}