【问题标题】:should Exceptions always be public异常应该总是公开的
【发布时间】:2011-10-17 14:53:15
【问题描述】:

我知道是a good thing to always make exceptions serializable。但我是否也应该始终公开它们?即使他们应该只在内部被抓住?如果异常不公开,我想知道是否可能存在任何安全问题或序列化问题(例如跨应用程序域编组)。

【问题讨论】:

    标签: .net exception


    【解决方案1】:

    Yes, they should.

    如果您知道异常会总是被您自己的代码捕获,那么将其设为internal 即可。

    【讨论】:

    • 但是那个页面说如果“你确定这个例外只被私下使用过”,可以禁止该规则,这是 OP 断言的一部分。
    • 并非如此:原因子句说“非公共异常直接来自异常、SystemException 或 ApplicationException。”
    【解决方案2】:

    事实上,如果内部异常不是您界面的一部分,那么它们并没有什么不好。然而,这意味着

    • 异常绝对不能跨越模块的边界,
    • 或者您提供一个公共基础异常,您的模块的用户可以捕获该异常。

    事实上,为您的模块声明一个公共基础异常类型是个好主意,这样您的用户就可以在他们的catch 子句中始终依赖它。如果您愿意,从基类派生的个别异常可以是公共的,但也可能不是。

    请注意,您绝对不能依赖公共/私有机制来确保任何类型的安全性,因为它很容易被普通反射覆盖。

    【讨论】:

      【解决方案3】:

      这与确定任何内容的范围相同。一切都应该在适当的范围内。

      如果您在特定类中创建异常并且只在类内部使用该异常,那么它应该只在类内部具有作用域,因此它应该是私有的。但是,这并不常见。

      第二个你有一个异常将被交给另一个调用你的类的对象,你应该把它公开。这是异常最常见的用法,因此大多数异常应该是公开的。

      【讨论】:

        【解决方案4】:

        考虑一下... 异常会到达多远的链条?如果要从 public 函数抛出异常,那么它本身应该是公开的。

        也就是说,如果异常总是在您的库中被捕获并且从未抛出或重新标记并作为其他东西抛出,则它可能是内部的。

        理想情况下,我会有这样的场景:

        namespace MyAPI
        {
            public class PublicException : System.Exception
            {
            }
        
            // derive my public exceptions from this
            public class CatchableException : PublicException
            {
            }
        
            // stuff that should never reach the users of my API
            internal class InvisibleException : System.Exception
            {
            }
        }
        

        这样,我的 API 的用户可以捕获我抛出的任何异常。内部的从来没有那么远。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          • 2013-01-25
          • 2019-06-24
          • 2018-12-23
          • 1970-01-01
          相关资源
          最近更新 更多