none
关于c#中的异常处理问题,求教!·· RRS feed

  • 问题

  • 这几天写代码的时候写的try..catch..finally..语句块用的比较多,

    突然想到的,在SQL 里面,如果执行异常的话,我可以用使用事务的回滚操作。

    那么在C#中呢?现在我所接触的就是如果出现异常,则抛出异常让catch处理,然后中断当前方法。但是前面已经处理的代码并不会返回。

    可能接触的比较少。我想知道的就是C#里面,是否有类似于SQL 一样,出现异常则自动回滚的功能。

    或者是需要自己另外写方法的,如果可以的话,发点代码或者说点思路借鉴下。谢谢

    2009年11月3日 2:56

答案

全部回复

  • 如果是操作数据库可以通过DbConnection.BeginTransaction来开始事务

    DbCommand的Commit可以提交事务
    Rollback可以回滚

    参考下面这个TransactionScope类的示例

    http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope(VS.80).aspx
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年11月3日 4:40
    版主
  • 你好!
         .NET框架提供了这种机制,可以使用TransactionScope 类,使一段代码成为事务性的代码,具体可以参考:
    http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope.aspx

    周雪峰
    2009年11月3日 4:45
    版主
  • 尝试了一下TranscationScope.但是怎么好像没有效果,是我写错了还是?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Transactions;

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            Ceshi ceshi = new Ceshi();
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                int a = 0;

                using (TransactionScope ts = new TransactionScope())
                {
                    try
                    {

                        ceshi.a = 3;
                        a = Convert.ToInt32("abc");

                      
                        ts.Complete();
                    }
                    catch (Exception ex)
                    {
                        //Transaction.Current.Rollback();
                        MessageBox.Show(ceshi.a.ToString());
                    }
                }
              
            }

            private void button2_Click(object sender, EventArgs e)
            {
                MessageBox.Show(ceshi.a.ToString());
            }

        }

        public class Ceshi
        {
            public int a;
        }
    }



    ceshi.a一直为3,我想要的是如果发生了异常,则ceshi.a还是原来的状态,0

    2009年11月3日 8:20
  • 再赋值0  不就行了
    2009年11月3日 8:47
  • 你好!
         这个类一般用于数据库操作的回滚!
    周雪峰
    2009年11月3日 10:15
    版主
  • 如果要回滚其他非数据库操作,还是需要在try...catch中自己写代码来实现!
    周雪峰
    • 已标记为答案 天驰 2009年11月4日 8:06
    2009年11月3日 10:19
    版主
  • 恩,谢谢
    2009年11月4日 8:05
  • 不客气啊!
    周雪峰
    2009年11月4日 11:01
    版主
  • 自己结贴··

    2009年11月6日 6:50