【发布时间】:2011-10-17 14:53:15
【问题描述】:
我知道是a good thing to always make exceptions serializable。但我是否也应该始终公开它们?即使他们应该只在内部被抓住?如果异常不公开,我想知道是否可能存在任何安全问题或序列化问题(例如跨应用程序域编组)。
【问题讨论】:
我知道是a good thing to always make exceptions serializable。但我是否也应该始终公开它们?即使他们应该只在内部被抓住?如果异常不公开,我想知道是否可能存在任何安全问题或序列化问题(例如跨应用程序域编组)。
【问题讨论】:
如果您知道异常会总是被您自己的代码捕获,那么将其设为internal 即可。
【讨论】:
事实上,如果内部异常不是您界面的一部分,那么它们并没有什么不好。然而,这意味着
事实上,为您的模块声明一个公共基础异常类型是个好主意,这样您的用户就可以在他们的catch 子句中始终依赖它。如果您愿意,从基类派生的个别异常可以是公共的,但也可能不是。
请注意,您绝对不能依赖公共/私有机制来确保任何类型的安全性,因为它很容易被普通反射覆盖。
【讨论】:
这与确定任何内容的范围相同。一切都应该在适当的范围内。
如果您在特定类中创建异常并且只在类内部使用该异常,那么它应该只在类内部具有作用域,因此它应该是私有的。但是,这并不常见。
第二个你有一个异常将被交给另一个调用你的类的对象,你应该把它公开。这是异常最常见的用法,因此大多数异常应该是公开的。
【讨论】:
考虑一下... 异常会到达多远的链条?如果要从 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 的用户可以捕获我抛出的任何异常。内部的从来没有那么远。
【讨论】: