【问题标题】:Which standard exception throw if there is error in a middle of operation?如果操作中间出现错误,会抛出哪个标准异常?
【发布时间】:2014-11-10 16:26:58
【问题描述】:

根据RTFM我不应该直接用Exception来扔。在重构代码时,我将其中大部分更改为

  • InvalidOperationException 如果方法调用不充分(错误的先决条件、时间、状态等);
  • TimeoutExeption 每当有超时时;
  • ArgumentException(以及相关的 - ArgumentNullExceptionArgumentOutOfRangeException)当使用错误参数调用方法时;

但是,当方法执行了一半的操作(所以参数和状态没问题)时,我坚持找出最适合的异常,但随后出现问题(在我的情况下,它是与外部的通信设备,当它突然报告“omg 错误”时)。

middle-progressfinalizing异常的情况下我应该使用什么标准异常(我不想派生出自己的) ?不应该是一个很难的问题,但是...

【问题讨论】:

  • 并非所有情况都包含在 .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


【解决方案1】:

视情况而定。如果它是 Web 服务(或可能是网站),您可能会抛出 500 Internal Server Error。

在某些情况下,在我的 c# wcf 服务中,我会执行以下操作:

 throw new System.ServiceModel.Web.WebFaultException<string>(
                "Descriptive error message",
                System.Net.HttpStatusCode.InternalServerError);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多