相关疑难解决方法(0)

显式调用事务回滚或让异常触发隐式回滚是一种更好的做法吗?

在下面的代码中,如果在执行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)

sql transactions rollback

20
推荐指数
1
解决办法
5548
查看次数

捕获.NET中的异常类

我一直听到这个

catch (Exception ex)
Run Code Online (Sandbox Code Playgroud)

然而,不好的做法是,我经常在事件处理程序中使用它,例如,操作可能会进入网络,从而可能出现许多不同类型的故障.在这种情况下,我捕获所有异常并在消息框中向用户显示错误消息.

这被认为是不好的做法吗?除了异常之外我无能为力:我不希望它停止应用程序,用户需要知道发生了什么,而且我处于代码的顶层.我还应该做什么?

编辑:

人们说我应该查看调用堆栈并专门处理错误,因为例如StackOverflow异常无法有意义地处理.然而,停止这个过程是最糟糕的结果,我想不惜一切代价阻止这一过程.如果我无法处理StackOverflow,那么就是这样 - 结果将不会比没有捕获异常更糟糕,并且在99%的情况下,就我而言,通知用户是最不好的选择.

此外,尽管我尽最大努力解决可能引发的所有可能异常,但在大型代码库中,我可能会错过一些.对于他们中的大多数人来说,最好的防御仍然是告知用户.

c# exception

19
推荐指数
5
解决办法
7198
查看次数

捕获System.Exception等非特定异常是不好的做法?为什么?

我目前正在进行代码审查,以下代码让我跳了起来.我看到这个代码存在多个问题.你是否同意我的观点?如果是这样,我如何向我的同事解释这是错误的(顽固型......)?

  • 捕获一般异常(Exception ex)
  • 使用"if(ex is something)"而不是另一个catch块
  • 我们吃SoapException,HttpException和WebException.但是如果Web服务失败了,那就没那么多了.

码:

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)

.net c# exception-handling exception

13
推荐指数
3
解决办法
6956
查看次数

NHibernate - ITransaction.Commit真的有必要吗?

我刚刚开始研究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的目的和方法提交吗?

谢谢

nhibernate

2
推荐指数
1
解决办法
4927
查看次数