簡體   English   中英

如何使用C#從派生類中的構造函數中捕獲異常?

[英]How to catch exception from a constructor in a derived class with C#?

我想知道如何使用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?
    }
}

甚至不想弄清楚如何做到這一點。 如果基類構造函數拋出異常,則表示基類處於錯誤狀態。 如果基類處於錯誤狀態,則意味着派生類處於錯誤狀態。 構造函數的要點是使對象進入可用狀態。 它失敗了。 出去!

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
    }
}   

我會像這樣處理它

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?
        }

    }
}

我用靜態方法解決了同樣的問題:

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");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM