[英]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.