gpt4 book ai didi

c# - 如何在 C# 中捕获通用异常的所有变体

转载 作者:行者123 更新时间:2023-12-03 03:27:30 26 4
gpt4 key购买 nike

我想捕获通用异常类的所有变体,我想知道是否有一种方法可以在没有多个 catch block 的情况下做到这一点。例如,假设我有一个异常类:

public class MyException<T> : Exception
{
public string MyProperty { get; }

public MyException(T prop) : base(prop.ToString())
{
MyProperty = prop?.ToString();
}
}

和两个派生类:

public class MyDerivedStringException : MyException<string>
{
public MyDerivedStringException(string prop) : base(prop)
{

}
}

public class MyDerivedIntException : MyException<int>
{
public MyDerivedIntException(int prop) : base(prop)
{

}
}

是否有一种方法可以在一个 catch block 中同时捕获 MyDerivedStringExceptionMyDerivedIntException

我已经尝试过这个:

try
{
...
}

catch(Exception e) when (e is MyDerivedStringException || e is MyDerivedIntException)
{
}

但它不是很干净,意味着我无法访问 MyProperty

我对问题的通用解决方案感兴趣,但在我的例子中,通用异常是在第三方库中定义的,如下所示,它为问题添加了一些额外的约束。

最佳答案

制造MyException<T>实现一个接口(interface)并通过接口(interface)类型检查异常。

界面:

public interface IMyException
{
string MyProperty { get; }
}

实现接口(interface)的通用类:

public class MyException<T> : Exception, IMyException
{
public string MyProperty { get; }

public MyException(T prop)
{
MyProperty = prop?.ToString();
}
}

派生类:

public class MyDerivedStringException : MyException<string>
{
public MyDerivedStringException(string prop) : base(prop)
{

}
}

public class MyDerivedIntException : MyException<int>
{
public MyDerivedIntException(int prop) : base(prop)
{

}
}

用法:

try
{
// ...
}
catch (Exception e) when (e is IMyException)
{
// ...
}

通过创建一个继承自Exception的基类也可以完成同样的事情。比制作​​MyException<T>从该基类派生。

关于c# - 如何在 C# 中捕获通用异常的所有变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59074049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com