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);
        }
    }

}