异常类可见性?

时间:2014-02-27 17:50:42

标签: c# exception exception-handling

已经使用C#大约五年了,现在才让我了解自定义异常的类可见性。编写内部甚至私有嵌套异常是完全合法的:

internal class WhyDoThis : Exception { }

public class Foo { private class WhyWhyWhy : Exception { } }

因此,当您在DLL中抛出这些异常时,只有(少数)正在进行体面(非口袋妖怪)异常处理的人才会使其应用程序崩溃。

所以我的问题是,这种模式的目的是什么?或者为什么这甚至合法?

3 个答案:

答案 0 :(得分:2)

一个简单的答案是:它和任何糟糕的代码一样合法。

我真的想不出在这里说的任何其他事情都不会超出这个问题的范围。就是这样。任何人都可以随时编写代码,即使可以编译也只是简单而且非常糟糕。

修改

我实际上可以想到一个场景,其中内部异常可以有一些用途:用于测试和断言框架,如Code Contracts但这是一个非常边缘的案例。

答案 1 :(得分:1)

从继承/可见性的角度来看,内部/私有异常没有错。它与提供私有类来实现公共接口完全相同 - 在外部使用该对象的人将无法(缺少反射)来获取未通过公共接口/基类公开的细节。

因此,在异常情况下,即使您触发非常特定的私有异常,外部调用者也只能捕获公共基本异常。例如,您可以这样做以提供自定义ToString

请注意,私有/内部异常可能是个坏主意,因为抛出特定异常的全部原因是让某人抓住特定异常。

同时检查Designing Custom Exceptions以确保您的异常类在所有情况下都有用(例如跨域异常需要序列化)。

答案 2 :(得分:1)

一个目的是内部用于程序集的异常(甚至私有地用于类),但异常永远不会从程序集(或类)中转义。在这种情况下,您不希望它在程序集(或类)外部可见。

在这种情况下,如果异常是逃避程序集(或类),那么显然是一个错误。