C# 中等效的 Try-Catch 块宏?

A Try-Catch Block Macro equivalent in C#?

这是一个示例 C++ 宏,我用它来使我的代码更具可读性并减少 Try-Catch 混乱:

#define STDTRYCATCH(expr)               \
    try {                               \
        return (expr);                  \
    }                                   \
    catch (const std::exception& ex) {  \
        handleException(ex);            \
    }                                   \
    catch (...) {                       \
        handleException();              \
    }

可用作:

int myClass::Xyz()
{
    STDTRYCATCH(myObj.ReadFromDB());
}

请注意,我正在寻找 STDTRYCATCH 来处理我们用 it.Is 附上的任何代码存根,在 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();
                         });
    }
}

和:

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

}

然后您的 class 需要实现该接口。