如何用C#从派生类中的构造函数捕获异常
本文关键字:构造函数 捕获异常 派生 何用 | 更新日期: 2023-09-27 18:19:47
我想知道如何用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?
}
}
甚至不要想办法做到这一点。如果基类构造函数抛出异常,则表示基类处于错误状态。如果基类处于错误状态,则表示派生类处于错误状态。构造函数的目的是使对象进入可用状态。它失败了。滚出去!
我想会这样处理
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");
}
}
}