C#中的Try-Catch块宏等价物? 这里有一个C++宏,它使我的代码更可读,减少了TestCcatch杂波: #定义STDTRYCATCH(expr)\ 试试{\ 返回(expr)\ } \ catch(const std::exception&ex){\ 手部异常(ex)\ } \ 捕获(…){\ handleException()\ }
它可以用作:C#中的Try-Catch块宏等价物? 这里有一个C++宏,它使我的代码更可读,减少了TestCcatch杂波: #定义STDTRYCATCH(expr)\ 试试{\ 返回(expr)\ } \ catch(const std::exception&ex){\ 手部异常(ex)\ } \ 捕获(…){\ handleException()\ },c#,macros,C#,Macros,它可以用作: int myClass::Xyz() { STDTRYCATCH(myObj.ReadFromDB()); } 请注意,我正在寻找处理随附的任何代码存根的STDTRYCATCH。C#中是否有等效的 您可以编写帮助程序: public static class ExcetpionHandler { public static void StdTryCatch(this object instance, Action act) { try
int myClass::Xyz()
{
STDTRYCATCH(myObj.ReadFromDB());
}
请注意,我正在寻找处理随附的任何代码存根的STDTRYCATCH。C#中是否有等效的 您可以编写帮助程序:
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();
});
}
}
以及:
但由于性能等原因,不推荐使用,如评论中所述
编辑:
与前面提到的cdhowie一样,您也可以准备接口:
public interface IExceptionHandler
{
void StdException(Exception ex);
}
然后:
然后,您的类需要实现该接口。您可以将闭包传递给处理异常的静态方法。我并不认为这是一个非常好的主意(异常处理的粒度在用例之间有所不同),但这是可能的。@PatrykĆwiek:请您详细说明一下好吗?太多的语法糖分对维护没有好处。Try/catch-em-all异常处理是一个非常糟糕的做法。在宏中隐藏必要的异常逻辑对我来说也是维护的噩梦。那么您是否有某种类型的开关,或者如果在handleException()中存在调度逻辑的恶梦?如果您使用实例方法,那么最好使用
接口IStdExceptionHandler{void StdException(Exception ex);}
,然后使用这个IStdExceptionHandler实例定义扩展方法,以避免反射开销。如果异常处理程序是C++代码中的空闲函数,那么将这更有意义的是,它是一个常规静态函数,它调用另一个静态函数来处理异常。
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);
}
}
}