应该例外是公开的

时间:2011-08-01 16:49:02

标签: .net exception

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

4 个答案:

答案 0 :(得分:4)

Yes, they should

如果您知道该异常将始终被您自己的代码捕获,那么可以使其internal

答案 1 :(得分:4)

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

  • 要么异常绝对不能越过模块的边界,
  • 或者您提供了模块用户可以捕获的公共基础异常。

事实上,为模块声明公共基本异常类型是个好主意,因此您的用户始终可以在catch子句中依赖它。如果您愿意,从基类派生的个别例外可能是公开的,但也可能不是。

请注意,您绝对不能依赖公共/私人机制来确保任何类型的安全性,因为它可以通过简单的反射轻松覆盖。

答案 2 :(得分:0)

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

如果在特定类中创建异常并且只在类中使用该异常,那么它应该只在类中有一个范围,因此它应该是私有的。但是,这并不常见。

第二个你有一个例外,将被交给另一个叫你班级的对象,你应该把它公之于众。这是例外的最常见用法,因此大多数例外应该是公开的。

答案 3 :(得分:0)

考虑一下......链条到底有多远是一个例外?如果要从公共函数抛出异常,那么它应该是公共的。

也就是说,如果异常始终在您的库中被捕获,并且从未被抛出或重新标记并以其他方式抛出,则它可以是内部的。

理想情况下,我有这种情况:

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用户可以捕获我抛出的任何异常。内部人员从来没有做到那么远。