如何使用C#从派生类中的构造函数中捕获异常?

时间:2013-06-23 23:00:50

标签: c# .net exception-handling constructor

我想知道如何使用C#从派生类中的构造函数中捕获异常。这样的东西:

public class MyClassA
{
    public MyClassA()
    {
        //Do the work
        if (failed)
        {
            throw new Exception("My exception");
        }
    }
}

public class MyClassB : MyClassA
{
    public MyClassB()
    {
        //How to catch exception from a constructor in MyClassA?
    }
}

4 个答案:

答案 0 :(得分:6)

甚至不想弄清楚如何做到这一点。如果基类构造函数抛出异常,则表示基类处于错误状态。如果基类处于错误状态,则意味着派生类处于错误状态。构造函数的要点是使对象进入可用状态。它失败了。滚出去!

答案 1 :(得分:1)

1)解决方法:在派生中创建一个工厂方法:

class MyClassB : MyClassA
{
    public static MyClassB Create()
    {
        try
        {
            return new MyClassB();
        }
        catch
        {
            // try to handle
        }
    }
}

2)或者在基础中创建一个类似的东西,不要抛出构造函数,而是在方法中:

class MyClassA
{
    public static MyClassA Create()
    {
        MyClassA x = new MyClassA();
        if (x.Failed)
            throw new Exception();
        return x;
    }
}

3)或提供可覆盖的策略来处理失败的状态:

class MyClassA
{
    public MyClassA
    {
        if (failed)
            OnFail();
    }

    protected virtual void OnFail()
    {
         throw new Exception();
    }
}

class MyClassB : MyClassA
{
    protected override void OnFail()
    {
        // don't throw
    }
}   

答案 2 :(得分:1)

我会这样处理它我认为

public class MyClassA
{

    protected bool test;
    public MyClassA()
    {
        //Do the work
        if (true)
        {
            test = true;
            return;
        }
    }
}

public class MyClassB : MyClassA
{
    public MyClassB() 
    {
        if (base.test)
        {
            //How to catch exception from a constructor in MyClassA?
        }

    }
}

答案 3 :(得分:1)

我用静态方法解决了同样的问题:

public class PdfReaderExtended : PdfReader
{
    public PdfReaderExtended(string filename) : base(filename)
    {

    }

    public static PdfReaderExtended CreateInstance(string filename)
    {
        var name = Path.GetFileName(filename);
        try
        {
            return new PdfReaderExtended(filename);
        }
        catch (Exception ex)
        {
            throw new ClientException("Oops");
        }
    }
}