我读过抛出异常是一项昂贵的操作。但是,不创建自己的异常会使您的代码更具表现力和可读性吗?
我的一些同事建议您只使用System.Exception并将自定义文本插入到邮件中,而不是创建新的自定义异常。
我对其他意见感兴趣。感谢任何建议。
答案 0 :(得分:4)
不要抛出System.Exception
。如初。
它的问题在于调用代码。出于多种原因捕获一般Exception
对象是一种不好的做法。如果你抛出Exception
基类的实例,那么调用代码别无选择,只能抓住Exception
,如果他们想要处理它。这会强制调用代码使用错误的做法。
此外,调用代码没有可靠的方法来区分异常是什么,如果得到的只是Exception
。
通常最好使用其中一个预定义的例外(如果有的话适用ArgumentException
,InvalidOperationException
等)。如果没有正确描述这种情况,那么自定义异常类是一种非常好的方法。
答案 1 :(得分:2)
抛出异常本身(创建对象,遍历堆栈等)的成本很高。制作自己的异常类几乎不增加任何开销,所以如果你要抛出异常,不要使其成为new Exception("message")
!
答案 2 :(得分:1)
异常并不意味着人们阅读(虽然他们的消息和堆栈跟踪由人们阅读),但它们应该由代码读取。如果您的代码可以响应自定义异常而执行某些操作,那么请务必使用它。但是这个例外注定要被记录下来,没有必要自定义。
自定义异常的开销是它们是维护和测试的另一个东西。如果现有异常是合适的,请改用它。 (例如,ArgumentNullException
代替ZipCodeNullException
。)
答案 3 :(得分:1)
在任何其他情况下,只使用Exception
即可。一般来说,实例化或抛出自定义异常并不比标准异常花费更多,至少与首先抛出异常的费用相比。根据定义,例外情况应该是例外情况,因此在抛出例外期间的表现不是问题。关键是要在查看抛出异常的原因时获取所需的所有信息。
答案 4 :(得分:0)
你的同事正在胡说八道。无论班级如何,抛出异常都是相同的费用。
说实话,所有这些关于“昂贵”例外的讨论 - 是的,它们比无效支票或其他类型更昂贵,所以不要用它们作为一些理智检查的替代品,但是应该鼓励它们在它们有意义的地方(比如IOException,这对他们来说是一个很好的用例 - I / O问题是一个例外情况,它们通常必须在正常的程序流程之外处理。)
答案 5 :(得分:0)
你永远不应该抛出System.Exception
,因为唯一的方法就是catch(System.Exception)
。抓住这样的一揽子例外是非常糟糕的做法。您应该捕获特定的异常,这些异常为您提供了一种正确处理它的方法,而不会使软件崩溃。通过生成自定义异常,您可以为自己提供一种可能识别并从中恢复的方法。
例如,如果您的代码意味着打开文件,并且您获得了未知异常,那么如何从中恢复呢?但是,如果您捕获特定的File Not Found异常,则更容易从中恢复。您可以明确告诉用户该文件不存在。
我认为没有理由相信自定义异常比内置异常更昂贵。
答案 6 :(得分:0)
“昂贵”是一个相对术语,并且 - 正如名称所暗示的那样 - 异常应该是一个例外,因此它可能不会影响代码的性能。抛出异常的代价是 - 据我所知 - 与异常的类型无关,所以你不应该把自己局限于System.Exception。
答案 7 :(得分:0)
我更喜欢使用最合适的内置异常,如果还不存在,则从System.ApplicationException派生出我自己的异常。
我不建议使用自定义消息抛出System.Exception。