何时使用新的异常类型

Kar*_*ten 15 .net wcf exception

什么时候创建新的异常类型而不是使用.Net中的内置异常?

让我思考的问题是这个.我有一个WCF服务,这是一个基本的输入输出服务.如果服务无法创建输出,因为输入无效,我想抛出异常,但是哪一个?

现在我只是抛出system.Exception,但这对我来说感觉不对,我不知道为什么,这只是感觉不对.有一件事让我感到困惑,如果我用单元测试测试它,我希望抛出system.Exception.该异常也可以由框架或其他代码抛出,而不是由我抛出的代码抛出.然后测试将通过,因为我得到预期的异常,但它应该失败.

您有什么推荐的吗?

Kei*_*ith 15

避免投掷System.ExceptionSystem.ApplicationException自己,因为它们太笼统.

对于WCF服务,存在故障合同 - 您可以告诉子公司要处理的一般例外.

将接口标记为:

[FaultContract( typeof( LogInFault ) )]
void LogIn( string userName, string password, bool auditLogin );
Run Code Online (Sandbox Code Playgroud)

然后,如果有异常,您可以抛出此特定错误:

throw new FaultException<LogInFault>( new LogInFault(), "message" );
Run Code Online (Sandbox Code Playgroud)

使用[DataContract]序列化可以解决问题 - 这使您无需处理通常需要的所有序列化内容.


Jon*_*eet 7

绝对避免为抛弃代码以外的任何东西抛出System.Exception.

如果方法的参数无效,则抛出ArgumentException(或某些派生的,更具体的异常).在创建自己的异常之前,请查阅文档以了解现有异常 - 但这样做通常很有用.(当然,您可以从ArgumentException派生自己的异常类型 - 如果您想要从多个位置指示某种特定类型的条件,则创建新类型会提供更多信息,而不仅仅是将其放入错误消息中. )

现在,WCF中的错误处理可能与"普通"框架中的错误处理不同 - 我建议您参考WCF特定的文档/书籍.