C#中的Try-Catch Block Macro等价物?

时间:2015-01-09 18:40:05

标签: c# macros

这是一个示例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#中是否存在等价物?

1 个答案:

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

}

然后你的班级需要阻止那个界面。