在下面的代码中,如果在执行SQL语句时抛出任何异常,我们应该期望在事务未提交时对事务进行隐式回滚,它会超出范围并被处置掉:
using (DbTransaction tran = conn.BeginTransaction())
{
//
// Execute SQL statements here...
//
tran.Commit();
}
Run Code Online (Sandbox Code Playgroud)
以上是一种可接受的做法,还是应该捕获异常并显式调用tran.Rollback(),如下所示:
using (DbTransaction tran = conn.BeginTransaction())
{
try
{
//
// Execute SQL statements here...
//
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 我一直听到这个
catch (Exception ex)
Run Code Online (Sandbox Code Playgroud)
然而,不好的做法是,我经常在事件处理程序中使用它,例如,操作可能会进入网络,从而可能出现许多不同类型的故障.在这种情况下,我捕获所有异常并在消息框中向用户显示错误消息.
这被认为是不好的做法吗?除了异常之外我无能为力:我不希望它停止应用程序,用户需要知道发生了什么,而且我处于代码的顶层.我还应该做什么?
编辑:
人们说我应该查看调用堆栈并专门处理错误,因为例如StackOverflow异常无法有意义地处理.然而,停止这个过程是最糟糕的结果,我想不惜一切代价阻止这一过程.如果我无法处理StackOverflow,那么就是这样 - 结果将不会比没有捕获异常更糟糕,并且在99%的情况下,就我而言,通知用户是最不好的选择.
此外,尽管我尽最大努力解决可能引发的所有可能异常,但在大型代码库中,我可能会错过一些.对于他们中的大多数人来说,最好的防御仍然是告知用户.
我目前正在进行代码审查,以下代码让我跳了起来.我看到这个代码存在多个问题.你是否同意我的观点?如果是这样,我如何向我的同事解释这是错误的(顽固型......)?
码:
try
{
// Call to a WebService
}
catch (Exception ex)
{
if (ex is SoapException || ex is HttpException || ex is WebException)
{
// Log Error and eat it.
}
else
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 我刚刚开始研究NHibernate 2天前,我正在寻找一个基于教程编写的CRUD方法.我的插入方法是:
using (ISession session = Contexto.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(noticia);
transaction.Commit();
session.Close();
}
Run Code Online (Sandbox Code Playgroud)
完整的"Contexto"代码在这里:http://codepaste.net/mrnoo5
我的问题是:我真的需要使用ITransaction transaction = session.BeginTransaction()和transaction.Commit(); ?
我问这个是因为我已经测试过运行没有这两行的网络应用程序,并且我已成功插入新记录.
如果可能的话,有人可以解释一下Itransaction的目的和方法提交吗?
谢谢