这是一个示例C ++宏,用于使我的代码更具可读性并减少Try-Catch Clutter:
#define STDTRYCATCH(expr) \
try { \
return (expr); \
} \
catch (const std::exception& ex) { \
handleException(ex); \
} \
catch (...) { \
handleException(); \
}
可以用作:
int myClass::Xyz()
{
STDTRYCATCH(myObj.ReadFromDB());
}
请注意,我正在寻找STDTRYCATCH来处理我们附带的任何代码存根。在C#中是否存在等价物?
答案 0 :(得分:2)
你可以写帮手:
public static class ExcetpionHandler
{
public static void StdTryCatch(this object instance, Action act)
{
try
{
act();
}
catch (Exception ex)
{
var method = instance.GetType().GetMethod("StdException");
if (method != null)
{
method.Invoke(instance, new object[] {ex});
}
else
{
throw;
}
}
}
}
用法:
public class MyClass
{
public void StdException(Exception ex)
{
Console.WriteLine("Thrown");
}
public void Do()
{
this.StdTryCatch(() =>
{
throw new Exception();
});
}
}
和
class Program
{
static void Main(string[] args)
{
var instance = new MyClass();
instance.Do();
}
}
但是由于性能原因等原因没有推荐 - 如评论中提到的那样。
修改强> 与提到的 cdhowie 一样,您也可以准备接口:
public interface IExceptionHandler
{
void StdException(Exception ex);
}
然后:
public static class ExcetpionHandler
{
public static void StdTryCatch(this IExceptionHandler instance, Action act)
{
try
{
act();
}
catch (Exception ex)
{
instance.StdException(ex);
}
}
}
然后你的班级需要阻止那个界面。