【问题标题】:How to force usage of Try/Catch around specific methods如何围绕特定方法强制使用 Try/Catch
【发布时间】:2013-12-03 14:37:43
【问题描述】:

我正在创建一个“通用”库,以供其他团队成员在各种解决方案项目中用作参考。这些方法通常是没有实际返回数据的void 函数。

我正在寻找为什么要强制在 Try...Catch 块内被其他人使用这些方法。我需要确保正确处理错误。我虽然依赖于布尔返回类型,但这也不允许我返回错误消息,所以我唯一的选择是抛出一个Exception

如果无法进行适当的强制,我如何制作一个在编译时弹出的属性以警告开发人员有关 Try/Catch 要求? (类似于Obsolete 属性)。

还有其他更好的方法吗?

编辑:

这是我的完整场景:

我有一个调用 Web 服务来远程更新值的代码方法。更新非常关键。它自己的方法可以正常工作,但是如果无法访问 Web 服务怎么办?该调用不返回任何值。

【问题讨论】:

    标签: c# exception attributes try-catch


    【解决方案1】:

    try/catch 块中放置某些内容并不能使其“得到妥善处理”——事实上,在绝大多数情况下,处理异常的正确方法是让它冒泡到一个新的水平。警告:try/finally 更常见,以允许资源清理,但更常见的是using

    您不能对代码强制执行“并且必须正确使用它”;这在任何 API 中都是隐含的,您只会引起恼怒和烦恼,并迫使人们采用不恰当和无益的编码风格,同时让您完全人为且不正确感觉代码是正确的。

    如果您想确保代码正常运行:测试它。

    没有可用于此场景的属性。您可能可以创建 FxCop 规则或类似规则,但出于上述原因:我不推荐它。

    【讨论】:

    • 我同意,但我可以给你一个反例。我有一个调用 Web 服务来更新值的方法。它自己的方法很好用。没有返回类型。如果无法访问 Web 服务怎么办? (知道更新非常关键)
    • @Moslem,那么你有一个大问题,并且围绕该方法的邻近调用者进行尝试/捕获不会有任何帮助。最好按照 Marc 的建议去做,让它冒泡到一个可以正确处理的地方(或者记录下来,显示给用户,或者两者兼而有之)。
    • @MoslemBenDhaou 那么确实,预计会有例外;但是更新非常重要的事实是调用代码的一个特性,需要设计一个适当的策略(回滚、重试等等)。这不是简单地通过创建try/catch 来完成的,而且相当复杂,应该对其进行测试
    • 这正是目前正在做的事情,不幸的是它被冒泡给最终用户。 (根本不处理)。我只是在寻找一种方法来确保它在某处得到处理
    • @MoslemBenDhaou 如果人们需要添加try/catch 只是为了让代码编译,那么他们将添加try/catch 只是获取要编译的代码;您要检查的是他们实际上在做一些明智的事情 - 这更难执行
    【解决方案2】:

    我实际上不会这样做,但作为对所述问题的有趣解决方案,您可以构建自己的异常类型:SuccessException。然后,在方法结束时抛出此异常以指示成功。如果没有某种形式的 try/catch,这使得该方法几乎无法使用。但是,再说一遍:不要这样做。

    【讨论】:

    • 但是请不要那样做:)
    • 非常有趣 :) 问题不在于抛出异常 :) 而是确保它得到处理。
    【解决方案3】:

    您可以返回自定义结果类:

    public class Result
    {
        public bool Okay { get; set; }
        public string Error { get; set; }
    }
    

    然后:

    var result = AttemptSomething();
    
    if (!result.Okay)
    {
        Console.WriteLine(result.Error);
    }
    

    或者返回string:

    var error = AttemptSomething();
    
    if (!String.IsNullOrEmpty(error))
    {
        Console.WriteLine(error);
    }
    

    或者将错误作为输出:

    string error;
    if (!AttemptSomething(out error))
    {
        Console.WriteLine(error);
    }
    

    或者返回Exception,但不要抛出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2017-10-06
      • 2012-11-22
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多