none
try...catch中如何同时处理throw和返回值? RRS feed

  • 问题

  • 我在DAL层写了一个保存datatable的方法,保存成功时返回0,如果保存不成功返回-1,并且把错误信息返回到其调用方法中。脚本如下。但是在catch中,return 和 throw都是返回,二者只能取其一。如果先return 一个值,那么调用的方法就不能获得返回的错误信息了。
    应当如何处理?多谢!

     using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    try
                    {
                        //......
                        adapter.Update(datatable);
                        sqltran.Commit();
                        return 0;
                    }
                    catch (Exception e)
                    {
                        return -1;
                        throw e;
                    }
                   finally
                    {
                        connection.Close();
                    }
                       

     

    2009年7月20日 9:03

答案

  • 谢谢各位。

    返回值是需要的,比如我想知道保存时是哪一行出现的错误。这个在exception中是没有的。

    捕捉exception,而不是SqlException,主要是这个是在dal层的方法,我想只要发生的错误都传递到调用层,否则非SqlException没有任何提示,也是不行的。

    看来return和throw是不能同时用了。我自己定义了一个类,包含要返回的值和exception信息,在异常处理中设置该类的属性,然后返回该类,来解决整个问题。

    -------
    最近论坛没办法回复了,以为是自己浏览器的问题,最后才知道需要升级IE ^-^
    • 已标记为答案 Miles2009 2009年7月21日 3:45
    2009年7月21日 3:44

全部回复

  • 你好,有了throw e,基本上return -1就没有意义了,程序会抛出异常,停止运行!
    jon.valett@gmail.com
    2009年7月20日 9:12
    版主
  • 建议,把错误信息写入日志中。
    jon.valett@gmail.com
    2009年7月20日 9:13
    版主
  • 您好,return和throw 在用法上是没办法在一个方法体中共存的。两者只能选其一。
    处理的方法
    1、选择直接return -1;   //这样可能不好无法确定什么样的异常
    2、选择继续往客户程序抛异常 throw e; //这样需要在客户程序中处理异常
    3、处理已知异常例如捕获SqlException //建议采用该方法
        例如:
                catch (IOException ex)
                {
                    throw ex;
                }
                catch (SqlException ex)
                {
                     if (...)
                   {
                       return -1; //将知道的异常捕获后返回指定的数字
                    }

               }
                catch (Exception ex)
                {
                    throw ex;
                }
    • 已建议为答案 wind2009 2009年7月20日 9:32
    2009年7月20日 9:18
  • 你好!
         我在代码中用注释来解释一下我个人的 意见,希望对你有帮助:
     using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    try
                    {
                        //......
                        adapter.Update(datatable);
                        sqltran.Commit();
                        return 0;
                    }
                    catch (Exception e)//这里不要直接捕获Exception类型的异常,这样做很难获得具体的错误信息了,而且也无法对具体的错误进行特殊的处理!
                    {
                        return -1;  //这里到底采用哪种策略,主要根据具体情况而定,如果这个异常比较严重,可以直接throw,使程序终止运行!否则可以直接返回错误码,代表这个函数失败了(这时调用这个函数的代码对错误进行处理)
                        throw e;
                    }
                   finally
                    {
                        connection.Close();
                    }

    周雪峰
    2009年7月20日 12:31
    版主
  • 您好,return和throw 在用法上是没办法在一个方法体中共存的。两者只能选其一。
    处理的方法
    1、选择直接return -1;   //这样可能不好无法确定什么样的异常
    2、选择继续往客户程序抛异常 throw e; //这样需要在客户程序中处理异常
    3、处理已知异常例如捕获SqlException //建议采用该方法
        例如:
                catch (IOException ex)
                {
                    throw ex;
                }
                catch (SqlException ex)
                {
                     if (...)
                   {
                       return -1; //将知道的异常捕获后返回指定的数字
                    }

               }
                catch (Exception ex)
                {
                    throw ex;
                }

    同意~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月20日 12:49
    版主
  • 谢谢各位。

    返回值是需要的,比如我想知道保存时是哪一行出现的错误。这个在exception中是没有的。

    捕捉exception,而不是SqlException,主要是这个是在dal层的方法,我想只要发生的错误都传递到调用层,否则非SqlException没有任何提示,也是不行的。

    看来return和throw是不能同时用了。我自己定义了一个类,包含要返回的值和exception信息,在异常处理中设置该类的属性,然后返回该类,来解决整个问题。

    -------
    最近论坛没办法回复了,以为是自己浏览器的问题,最后才知道需要升级IE ^-^
    • 已标记为答案 Miles2009 2009年7月21日 3:45
    2009年7月21日 3:44