4

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

4 に答える 4

7

これを行う方法を理解しようとさえしないでください。基本クラスのコンストラクターが例外をスローしている場合は、基本クラスが悪い状態にあることを意味します。基本クラスが悪い状態にある場合、それは派生クラスが悪い状態にあることを意味します。コンストラクターのポイントは、オブジェクトを使用可能な状態にすることです。失敗しました。取り出す!

于 2013-06-23T23:09:58.130 に答える
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
    }
}   
于 2013-06-23T23:07:41.497 に答える
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?
        }

    }
}
于 2013-06-23T23:08:41.600 に答える