【发布时间】:2014-11-10 16:26:58
【问题描述】:
根据RTFM我不应该直接用Exception来扔。在重构代码时,我将其中大部分更改为
-
InvalidOperationException如果方法调用不充分(错误的先决条件、时间、状态等); -
TimeoutExeption每当有超时时; -
ArgumentException(以及相关的 -ArgumentNullException和ArgumentOutOfRangeException)当使用错误参数调用方法时;
但是,当方法执行了一半的操作(所以参数和状态没问题)时,我坚持找出最适合的异常,但随后出现问题(在我的情况下,它是与外部的通信设备,当它突然报告“omg 错误”时)。
在middle-progress或finalizing异常的情况下我应该使用什么标准异常(我不想派生出自己的) ?不应该是一个很难的问题,但是...
【问题讨论】:
-
并非所有情况都包含在 .NET Framework 中的现有异常中。 Middle-progress 似乎并不是一个很好的例外,但鉴于您对问题的描述,您为什么不创建一个派生自 System.Exception 的 DeviceCommunicationException?这似乎完全适合并描述了您遇到的实际问题。
-
@JamieSee,如果我只做一次,那么我就无法停止在任何地方都这样做(更多的
DeviceCommunication..异常会出现);) 所以没有什么更多的了 default?InvalidOperationException实际上很合适(对于方法的用户来说,原因是 bad 调用,而设备不是 100% 可操作,他的问题是)。 :) -
对这种事情总是有点判断力。 Microsoft 确实在msdn.microsoft.com/en-us/library/ms229014.aspx 上提供了一些关于异常设计的指导,值得一看。我自己的观点是,异常应该描述遇到的实际问题,而不是特定过程的阶段。我也尝试看看我是否可以减少会导致我抛出异常的问题。是否适合轮询设备一段时间以查看它是否达到可操作状态,如果未达到则抛出 TimeoutException?
-
如果没有更具体的问题,就无法提供好的答案。但是在处理通信故障方面,如果你不想定义自定义异常,我会说 IOException 是一个不错的选择。即使是自定义异常也应该继承 IOException。或者,根据错误的确切性质,可能的 InvalidDataException 是合适的(即通信正常,但数据本身有问题...格式错误、字节损坏等)
-
声明你自己的 OmgException 类型。
标签: c# vb.net exception c++-cli standards