Jam*_*ing 29 .net c# idisposable
在该IDisposable.Dispose方法中有一种方法可以确定是否抛出异常?
using (MyWrapper wrapper = new MyWrapper())
{
throw new Exception("Bad error.");
}
Run Code Online (Sandbox Code Playgroud)
如果在using语句中抛出异常,我想在处理IDisposable对象时知道它.
Kel*_*lyn 18
您可以IDisposable使用方法扩展Complete并使用以下模式:
using (MyWrapper wrapper = new MyWrapper())
{
throw new Exception("Bad error.");
wrapper.Complete();
}
Run Code Online (Sandbox Code Playgroud)
如果在using语句中抛出异常,则Complete之前不会调用该语句Dispose.
如果您想知道抛出了什么确切的异常,那么订阅AppDomain.CurrentDomain.FirstChanceException事件并将最后抛出的异常存储在ThreadLocal<Exception>变量中.
这种模式在TransactionScope课堂上实施.
这是不可能捕获的异常Dispose()的方法.
但是,可以检查Marshal.GetExceptionCode()Dispose以检测是否确实发生了异常,但我不会依赖它.
如果您不需要类并且只想捕获Exception,则可以创建一个接受在try/catch块中执行的lambda的函数,如下所示:
HandleException(() => {
throw new Exception("Bad error.");
});
public static void HandleException(Action code)
{
try
{
if (code != null)
code.Invoke();
}
catch
{
Console.WriteLine("Error handling");
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
例如,您可以使用自动执行事务的Commit()或Rollback()并执行某些日志记录的方法.通过这种方式,您并不总是需要try/catch块.
public static int? GetFerrariId()
{
using (var connection = new SqlConnection("..."))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
return HandleTranaction(transaction, () =>
{
using (var command = connection.CreateCommand())
{
command.Transaction = transaction;
command.CommandText = "SELECT CarID FROM Cars WHERE Brand = 'Ferrari'";
return (int?)command.ExecuteScalar();
}
});
}
}
}
public static T HandleTranaction<T>(IDbTransaction transaction, Func<T> code)
{
try
{
var result = code != null ? code.Invoke() : default(T);
transaction.Commit();
return result;
}
catch
{
transaction.Rollback();
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11680 次 |
| 最近记录: |