C# 异常类可见性?

C# 异常类可见性?,c#,exception,exception-handling,C#,Exception,Exception Handling,我已经使用C#大约五年了,直到现在才对自定义异常的类可见性产生了深刻的印象。编写内部甚至私有嵌套异常是完全合法的,如下所示: internal class WhyDoThis : Exception { } public class Foo { private class WhyWhyWhy : Exception { } } 因此,当你在DLL中抛出这些异常时,只有(少数)做了适当(非口袋妖怪)异常处理的人的应用程序崩溃 所以我的问题是,这种模式的目的是什么?或者为什么这是合法的 一个简单

我已经使用C#大约五年了,直到现在才对自定义异常的类可见性产生了深刻的印象。编写内部甚至私有嵌套异常是完全合法的,如下所示:

internal class WhyDoThis : Exception { }

public class Foo { private class WhyWhyWhy : Exception { } }
因此,当你在DLL中抛出这些异常时,只有(少数)做了适当(非口袋妖怪)异常处理的人的应用程序崩溃


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

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

我真的想不出还有什么能不超出这个问题范围的话要说。事情就是这样。任何人,在任何时候,都可以编写代码,即使可以编译,也只是简单而糟糕

编辑:


实际上,我可以想到一种内部异常可能有一些用途的场景:用于测试和断言框架,如但这是一个非常边缘化的情况。

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

所以在异常情况下,外部调用方只能捕获公共基异常,即使您触发非常特定的私有异常。例如,您可以这样做来提供定制的
ToString

请注意,私有/内部异常可能是个坏主意,因为引发特定异常的整个原因是为了让某人捕获特定异常


另外,请检查以确保您的异常类在所有情况下都是有用的(例如跨域异常需要序列化)。

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


在这种情况下,如果异常转义程序集(或类),则显然是一个bug

我想,可能是晚一点。这只是一种情况,编译器没有深入分析类的使用情况。没有一种机制可以说,这个类和从它派生的任何东西都必须是公共的。“既然“隐藏”类型会暴露在外部?”以什么方式?这样您就可以看到这些异常的实例了?这并不是什么新鲜事
public class Foo{private class Bar{}public Object GiveMeABar(){return new Bar();}}}
@JonSkeet aarrggh。对这很明显,现在你展示出来了。我应该想到这一点。刚刚被这个工具卡住了。出于好奇,口袋妖怪异常处理是什么样子的?:)@Crono try{…}catch(例外e){//必须捕获所有对象}它回答了为什么它是合法的。有很多不好的代码实践是合法的。@DLeh现在的答案对我来说似乎是有效的,在我写评论的时候它不是。@ken2k是对的。当我第一次回答这个问题时,我读得太快了,我认为问题更多的是使用异常来控制流,而不是如何设置它们的可见性。我的错,我的错。如果您创建的异常只能在内部处理,那么您就做错了。同意@Crono的说法,在这种情况下,您将异常用于正常的代码流。@ken2k,所以您是说在子系统(程序集内部)中,您永远不应该抛出异常(您打算在该子系统中处理的异常)--回到使用返回值来处理错误?捕获仅由该程序集生成的异常,IMO,并没有说明它是否是正常的代码流。这些都是独立的。@Crono,在某些情况下,这会违反关注点的分离。如果给定的类不应该知道这些条件,它应该抛出并让知道这些条件的类捕获并处理错误。想象一下,例如,您将整个程序放在一个程序集中——您仍然建议不要抛出任何自定义异常吗?