【问题标题】:What's a good substitute for an enum?什么是枚举的好替代品?
【发布时间】:2010-09-29 21:56:46
【问题描述】:

我正在编写一个返回不同类型错误的 Web 服务。
每个方法都可以返回以下三种基本错误类型之一:
GeneralInvalidInputNon
除了这三个可能的值之外,每种方法都可能有自己的错误(例如,对于 SignIn 方法 - InvalidPassword) - 但每种方法只能返回一个错误。
例如,SignIn 方法将能够返回以下错误类型之一:General、InvalidInput、Non、InvalidPassword。
一开始我想用枚举,但现在我认为错误类型应该实现继承,因为有基本的三种类型,每个新方法的错误类型都继承自那个..但我真的想不出怎么做。我曾想过使用一个静态类 - 但它只会有一个字符串静态字段 - 并且继承再次无关紧要......
枚举的另一个问题是,Web 服务的客户端最终会得到一个无意义的 int(通过 json)

所以我的问题是:什么是传达存在三个基本可能值的想法的好方法,并且您可以添加这些值以产生新类型的错误?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您最好重新考虑您的界面。

    使用异常而不是错误代码要好得多,不仅因为很容易忘记检查错误代码,而且因为很难维护它们,保持它们的唯一性和意义。

    John Saunders states 在类似的帖子中:

    [...] 你应该抛出一个SoapException。这将或多或少直接转化为 SOAP 故障。 SOAP 故障是指示 Web 服务操作错误的适当方式,原因与异常比正常方法中的返回状态更好的原因相同 - 您不必在调用时检查返回状态。

    除了抛出 SoapException 之外,您还可以抛出任意异常。 ASP.NET 会将这些异常包装到一个SoapException 中,然后传递给客户端。客户端可以在SoapException的内部异常中访问异常的详细信息。

    更多解释参见:

    Handling and Throwing Exceptions in XML Web Services

    【讨论】:

    • 我真的刚毕业,不能和你们争论,但恕我直言,这不是一个好的解决方案——例外情况通常会隐藏真正的问题。我希望我的代码能够优雅地到达 return 语句,即使它只是为了宣布在此过程中出了点问题。我很确定我可以找到一个著名的专业程序员的博客文章这样说.. 这是-@987654323 @ .还是我没有得到你?
    • @Oren A:我不会说 Joel 一般都在这里,但我相信他只是指 Eric Lippert 在他的blog post.
    • @0xA3,我认为 OP 在这个特定的用例中可能有一点。我想我们都同意普通的 C# 异常是对 SoapExceptions 的正确模拟。我认为 SignIn 方法实际返回 SignIn 的结果肯定是有理由的——它不会返回任何其他内容。无效的用户名实际上不是异常。 IMO,我只在代码中存在错误而不是由于用户输入无效时才使用异常。
    • 空间不足,但话虽如此,我同意 @0xA3 的回答,因为 OP 计划在他的所有方法中使用这种模式,我不建议这样做。
    • 异常只会隐藏真正的问题,挥舞着一面大红旗,上面写着“这里可能有问题”。错误处理异常可以隐藏问题,但是像这样的滚动你自己的异常系统也会隐藏它们,以及当有标准支持的方法时滚动你自己的任何东西的缺点。与普通异常相比,它的唯一优势是避免使用“异常”一词。
    猜你喜欢
    • 2011-08-08
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2015-02-16
    相关资源
    最近更新 更多