C#用户定义的异常

时间:2018-10-06 06:42:52

标签: c# .net

如果该类定义了在C#中扩展System.exception类的用户定义异常,是否有必要在“公开”可见性模式下声明一个类?

2 个答案:

答案 0 :(得分:2)

这完全取决于您要如何使用用户定义的异常类。

访问修饰符的概念与用户定义的异常的概念完全无关。

用户定义的异常只是扩展System.Exception的用户定义的类,而访问修饰符是一种结构,用于指定该类相对于客户端代码的可见性。

这意味着,如果您只想在定义程序集中使用自定义异常类,则只需将其定义为内部类即可。 当然,这不会很有用,因为您通常在类库中定义自定义异常类,并且希望它们在引用该类库的任何程序集中可见,以便使用者可以在以下情况下处理您的自定义异常类:在他或她的客户代码中很有意义。

答案 1 :(得分:0)

Try it on DotNetFiddle并查看:

public class Foo
{
    private class MyException : Exception
    {
        public MyException(string message) : base(message) { }
    }

    public static void Throw()
    {
        throw new MyException("Hello world.");
    }
}
public class Program
{
    public static void Main()
    {
        try
        {
            Foo.Throw();
        }
        //catch(Foo.MyException myException)
        //{
        //     This doesn't compile
        //}
        catch(System.Exception exception)
        {
            Console.WriteLine
            (
                "Exception is of type '{0}' with a message of '{1}'", 
                exception.GetType().Name, 
                exception.Message
            );
            //Does not compile:
            //var typedException = (Foo.MyException)exception;  
        }
    }
}

输出:

Exception is of type 'MyException' with a message of 'Hello world.'

因此,事实证明您仍然可以捕获异常,检查其类型并读取其基本属性,并且一切正常。但是,如果要以类型安全的方式处理它并将其转换为特定类型,则代码将无法编译。这也意味着您不能使用特定于类型的catch处理程序。