try-catch块具有返回类型

时间:2009-03-02 15:18:04

标签: c# error-handling

如果我有一个返回某些东西的方法,比如

public DataTable ReturnSomething()
{
   try
   {  
      //logic here
     return ds.Tables[0];
   }
   catch (Exception e)
   {
      ErrorString=e.Message;
   }
}

这会产生编译器错误,显然是因为catch{}块没有返回任何内容。

所以当我有返回值的方法时,我不使用try-catch块,这是一种不好的做法。如果有错误,我想将错误字符串设置为该错误。但是我还需要一个返回值。建议吗?

11 个答案:

答案 0 :(得分:31)

将您的返回值存储在一个临时变量中:

public DataTable ReturnSomething()
{
    DataTable returnValue = null;

    try
    {
        //logic here
        returnValue = ds.Tables[0]; 
    }
    catch (Exception e)
    {
        ErrorString=e.Message;
    }

    return returnValue;
}

答案 1 :(得分:17)

你应该在catch块中引发/抛出异常并在调用方法中处理它。

public void invokeFaultyCode()
{
    try
    {
        DataTable dt = ReturnSomething();
    }
    catch(Exception e)
    {
        // Print the error message, cleanup, whatever
    }    
}
public DataTable ReturnSomething() throws Exception
{
   try
   {  
      //logic here
     return ds.Tables[0];
   }
   catch (Exception e)
   {
      ErrorString=e.Message;
      throw;
   }
}

PS:很抱歉任何语法错误,我在C#上有点生疏。

答案 2 :(得分:7)

你应该用try catch包装调用者...在被调用的例程中发生的任何异常都会冒出来给调用者,你可以在那里捕获它们。

就个人而言,我认为在这个例程中有一个try catch是不合适的,因为你应该让调用者处理异常。

对于我的例子,这将编码如下......

private void DoSomething() {
    try {
        DataTable dt = ReturnSomething();
    }
    catch (Exception ex) {
    }    
}

public DataTable ReturnSomething() {
    DataTable dt = new DataTable();

    // logic here
    return dt;
}

答案 3 :(得分:6)

ErrorString变量看起来很像错误代码变量。建议的做法是使用异常在必要时直接传递错误信息,而不是将内容存储到错误代码中。

如果您只是让调用者捕获异常,那么您正在使用ErrorString执行相同的操作:从方法本身中删除响应错误的责任。这是一个很好的目标。但是使用错误字符串并不能获得任何使用异常的功能。事实上,你以这种方式失去了信息。可能发生任何类型的错误,并且许多错误都与它们相关联,并且具有自己的特殊属性来保存有关失败的上下文信息。只需将消息存储在String中,就会丢失此信息。

因此,除非你的目标是专门隐藏调用者发生的错误类型,否则你只能通过让异常通过来获得。

要考虑的另一件事是这是否真的是错误情景。如果是,那么你的调用方法几乎不会关心返回值。在这种情况下,您只需让异常退出并且不返回任何内容就无需担心。如果它不是一个真正的错误场景,并且调用者只是继续并做其他事情,那么,这是由调用者决定的,对吧?通过返回错误字符串和虚拟DataTable或null来获取仍然没有太大的好处,而不是抛出所有上下文失败信息的异常。

答案 4 :(得分:4)

如果您打算“不要抛出异常路线”(我不一定会推荐),您可以按照MS使用的TryParse方法进行操作。

类似的东西:

private string FillDataTable(out DataTable results)
{

  try
{
  results = new DataTable(); //something like this;
  return String.Empty;
}
catch (Exception ex)
{
  results = null;
 return ex.Message;

}

}

答案 5 :(得分:3)

这取决于你的申请。您可以返回null,空DataTable或任何适合的情况。

答案 6 :(得分:3)

我假设您仍然可以设置消息,然后返回null或c#等效的

public DataTable ReturnSomething(){ 
   try {
        //logic here 
        return ds.Tables[0]; 
   } catch (Exception e) {
        ErrorString=e.Message;
        return null;
   }
}

答案 7 :(得分:2)

这个怎么样:

public DataTable ReturnSomething(out string errorString)
{
   errorString = string.Empty;
   DataTable dt = new DataTable();
   try
   {  
      //logic here
     dt = ds.Tables[0];
   }
   catch (Exception e)
   {
      errorString = e.Message;
   }
   return dt;
}

答案 8 :(得分:1)

由于您在示例中处理异常(而不是再次抛出异常),因此外部代码假设每个都没问题,因此您应该返回一些有用的东西。

如果你需要在那里捕获异常并做一些好的事情,但是如果它仍然是一个错误的情况你也应该抛出它,或者一个不同的异常,也许是你刚刚捕获的那个作为InnerException。

答案 9 :(得分:0)

我认为您的代码正在调用堆栈的足够高级别运行,并且它与UI代码混合在一起。如果确实如此,您可以在catch块中return null。但是,如果您正在编写可重用的代码,则应该重构它以使其不包含UI操作并在调用堆栈中的更高级别处理异常。

答案 10 :(得分:0)

您可以像下面的示例代码那样。

public DataTable ReturnSomething(out string OutputDesc)
{
   try
      {
         //logic here
         OutputDesc = string.Format("Your Successful Message Here...");
         return ds.Tables[0];
      }
      catch (Exception e)
      {
         OutputDesc =e.Message;
         return null;
      }

}