0

对于我们在我工作的公司开发的软件,我们使用第三方库,该库由我们经常联系的人开发。他的代码是用 C++ 编写的,我们在项目中使用 C#。

通常,他的库函数会返回错误代码。我决定使用不同的异常类来涵盖不同范围的错误代码。比如参数处理错误的一个异常类,主要操作错误的一个异常类,输入值错误的一个异常类等等。

他认为这不是一个好主意,并建议为库使用一个异常类来捕获所有错误,然后从 XML 文件中获取错误代码并将问题输出给用户。他认为,编写多个异常类是没有意义的。而且他还说他不能保证错误代码在不同版本的库中是相同的。

我认为拥有多个异常类是个好主意,因为:

  1. 可能存在不同的情况,我们需要以不同的方式处理问题。也许当出现参数异常时,除了输出错误之外,还可以做其他事情。但是他认为他的库正在处理所有事情,我们应该停止操作并输出错误。除了显示错误消息之外,我也想不出许多我们需要以不同方式处理的案例的具体示例。但我觉得我们可能需要它,我担心我只是违反了 YAGNI 原则。
  2. 我认为如果他错了,我们需要在不同的情况下以不同的方式处理事情,我将不得不引入条件代码(如果错误是 A 则执行此操作,如果 B 则执行此操作)。而且会很难处理。

我认为以一种我们可以以不同方式处理不同类型异常的方式来开发程序是一个更好的主意。但是那个人比我有更多的经验,而且他在公司里更有信誉(我是一个新的实习生)而且我对软件开发还很陌生,我觉得也许他是对的,我只是在尝试添加额外的代码,因为它看起来很漂亮,并且违反了 YAGNI 原则。

你认为我们应该上一门课还是多门课?如果您认为我们应该使用多个异常类,您的理由是什么?

4

3 回答 3

1

如果错误代码可以从一个版本更改为另一个版本,那么再多的工作(或缺少它)都不会为您省去在某个时候必须以某种方式重新映射这些代码的麻烦。如果您有代码(或代码范围)异常,那么当错误代码确实发生变化时(您将重新安排抛出的异常,就像您一样如果您没有专门的课程,则必须为一个例外调整消息)。

此外,在一般实践中,按照 .NET 约定,您应该为 BCL 提供的异常未恰当涵盖的特定异常创建一个专用的异常类(不包括使用其中的一些仅用于抽象的异常类)。

对于一些 Microsoft 输入,请考虑以下内容

应用程序和库不应使用返回码来传达错误。

这:_

考虑抛出驻留在系统命名空间中的现有异常,而不是创建自定义异常类型。

但是,遵循异常设计指南

[将] 帮助确保您在适当的情况下使用现有的例外,并在它们为您的图书馆增加价值的地方创建新的例外。

坚持你的枪。

于 2013-01-28T15:24:40.820 回答
0

你是对的。对于不同类型的错误(对于不同的错误代码),最好使用多个异常类。异常在某种程度上是错误代码的继承者,因此最好使用异常。那家伙提供的方法再次使用错误代码,由一个异常类包装。

我想到了带有他的号码的 SqlException。通过检查错误代码来捕捉不同类型的错误真是太糟糕了。

于 2013-01-28T15:23:24.943 回答
0

您绝对应该使用多个异常类。请注意,在命名空间中已经创建了大量的内置类,System例如ArgumentNull和朋友。

如果您想查看不使用多个异常的情况,请查看 COM interop。这是一个黑暗的地方,抛出了通用异常,并且它们的推理由一个 integer 来证明HRESULT。相信我,你不想重新创建它。

一个非常具体的用例是,例如,当您只想捕获某个异常时。IE

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)
  }
}
于 2013-01-28T15:29:08.050 回答