【发布时间】:2017-07-19 12:17:37
【问题描述】:
有没有办法在 C# 中扩展 using 块,将委托作为 IDisposable 对象旁边的第二个参数,并在每次在 using 块内引发异常时执行?
假设我们有一个委托,如下所示:
public delegate void ExceptionHandler(Exception ex);
假设我有一个与该委托匹配的方法,如下所示:
public void Log(Exception ex)
{
// Some logging stuff goes here
}
我想完成这样的事情:
using(SqlConnection connection = new SqlConnection(""), Log)
{
}
有没有办法以这种方式扩展 C#?
【问题讨论】:
-
为什么不将 using 块封装在 try 块中并在抛出异常时调用 Log?
-
你有理由不在 using 块内使用 try-catch 块吗?
-
@TomaszJuszczak 在不调用
Dispose()的情况下,无论如何都无法捕获和记录异常,因此这并不重要。 -
一个完整的旁白:Python 的context managers 可以满足您的需求。
__exit__函数无论是否有错误都会被调用,但如果发生错误,错误会作为参数传递给它。这意味着上下文管理器不仅仅充当try,finally块;它们还可以用于封装except块的功能。 -
感谢您的回答。我刚刚在 python 中探索过了。太好了。我希望这种功能会在未来的版本中添加到 C# 中:)
标签: c# .net using-statement