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

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

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

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

我会这样处理它

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

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