已经使用C#大约五年了,现在才让我了解自定义异常的类可见性。编写内部甚至私有嵌套异常是完全合法的:
internal class WhyDoThis : Exception { }
public class Foo { private class WhyWhyWhy : Exception { } }
因此,当您在DLL中抛出这些异常时,只有(少数)正在进行体面(非口袋妖怪)异常处理的人才会使其应用程序崩溃。
所以我的问题是,这种模式的目的是什么?或者为什么这甚至合法?
答案 0 :(得分:2)
一个简单的答案是:它和任何糟糕的代码一样合法。
我真的想不出在这里说的任何其他事情都不会超出这个问题的范围。就是这样。任何人都可以随时编写代码,即使可以编译也只是简单而且非常糟糕。
修改强>
我实际上可以想到一个场景,其中内部异常可以有一些用途:用于测试和断言框架,如Code Contracts。 但这是一个非常边缘的案例。
答案 1 :(得分:1)
从继承/可见性的角度来看,内部/私有异常没有错。它与提供私有类来实现公共接口完全相同 - 在外部使用该对象的人将无法(缺少反射)来获取未通过公共接口/基类公开的细节。
因此,在异常情况下,即使您触发非常特定的私有异常,外部调用者也只能捕获公共基本异常。例如,您可以这样做以提供自定义ToString
。
请注意,私有/内部异常可能是个坏主意,因为抛出特定异常的全部原因是让某人抓住特定异常。
同时检查Designing Custom Exceptions以确保您的异常类在所有情况下都有用(例如跨域异常需要序列化)。
答案 2 :(得分:1)
一个目的是内部用于程序集的异常(甚至私有地用于类),但异常永远不会从程序集(或类)中转义。在这种情况下,您不希望它在程序集(或类)外部可见。
在这种情况下,如果异常是逃避程序集(或类),那么显然是一个错误。