如何使用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"); } } }