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 需要实现该接口。
这是一个示例 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 需要实现该接口。