c# - 抛出正确类型的异常

标签 c# .net exception

在我的代码中,我经常遇到这样的情况:

public void MyMethod(string data)
{
    AnotherClass objectOfAnotherClass = GetObject(data);
    if (objectOfAnotherClass == null)
        throw new WhatExceptionType1("objectOfAnotherClass is null.");

    if (objectOfAnotherClass.SomeProperty < 0)
        throw new WhatExceptionType2("SomeProperty must not be negative.");
}

假设 GetObject 使用了一些不受我控制的外部库,如果没有 data 的对象,这个库返回 null存在并将负 SomeProperty 视为有效状态,因此不会引发异常。进一步想象 MyMethod 不能在没有 objectOfAnotherClass 的情况下工作,并且对于负的 SomeProperty 也没有意义。

WhatExceptionType1/2 在这种情况下抛出的正确异常是什么?

基本上我有四种选择:

  • 1) InvalidOperationException,因为 MyMethod 在上述条件下没有意义。另一方面,指南(以及 VS 中的 Intellisense)表示如果方法所属的对象处于无效状态,则应抛出 InvalidOperationException。现在对象本身不处于无效状态。而是输入参数data和其他一些基于该参数的操作导致MyMethod无法再操作的情况。

  • 2) ArgumentException,因为 data 有一些值是该方法可以处理的,而其他值是该方法不能处理的。但是我无法通过单独检查 data 来检查这一点,我必须在决定之前调用其他操作。

  • 3) Exception,因为我不知道要使用哪种其他异常类型,而且因为所有其他预定义异常都感觉过于专业,不适合我的情况。

  • 4) MyCustomException(我自己的异常类型派生自 Exception)。这似乎总是一个选项,但我担心当我开始遵循这种模式时,我必须为许多不同的错误条件定义许多特殊的异常类。

还有其他更好的选择吗?支持或反对这些选项的论点是什么?

提前感谢您的反馈!

最佳答案

如果存在有意义的内置异常,我会使用它们。如果不是,滚动您自己的异常是有意义的——即使它是一个扩展 Exception 的空类——因为这允许您检测特定的异常类型。例如,如果您只是抛出异常,您怎么知道异常是因为 objectOfAnotherClass 为空,而不是在 GetObject 中引发的异常?

总结一下:特定异常更好,因为您可以(可能)诊断特定案例并从中恢复。因此,使用内置的 .NET 异常(如果它们足够的话),或者滚动你自己的异常(exception)。

编辑:我应该澄清一下,我很少使用现有的异常并在其中添加一条消息。如果异常类型告诉您错误,它会使您的代码更具可读性,而不必调试、生成异常,然后检查消息以查看问题所在。

关于c# - 抛出正确类型的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605610/

相关文章:

c# - (MSTest) 扩展 ExpectedExceptionBaseAttribute 隐藏测试失败解释

c# - 使用 Lambda 或 LINQ 将一个类列表转换或映射到另一个类列表?

c# - 如何为我的代码正确使用 "using"语句

.net - 如何在灰色位图图像上绘制彩色形状?

c# - .NET StringBuilder - 检查是否以字符串结尾

c++ - 捕获 "Access violation reading location 0x00000000"异常

c# - 在 Windows 窗体应用程序中将数据从一个 OleDb 数据库复制到另一个

c# - 通过 Autofac 进行 Mapster 依赖注入(inject)

.net - 什么 WinForms 控件对应于 VCL (Delphi) TControlBar?

java.sql.SQLException : [SQLITE_CONSTRAINT]