try-catch块具有返回类型

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

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

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

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

将您的返回值存储在一个临时变量中,如下所示:

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

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

 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#有点生疏。

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

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

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

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

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

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

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

 private void DoSomething() { try { DataTable dt = ReturnSomething(); } catch (Exception ex) { } } public DataTable ReturnSomething() { DataTable dt = new DataTable(); // logic here return dt; } 

如果您打算“不要抛出exception路线”(我不一定会推荐),您可以按照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; } 

}

这取决于你的应用程序。 您可以返回null ,空DataTable或任何适合的环境。

我假设你仍然可以设置消息,然后返回null或c#等价物

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

这个怎么样 :

 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; } 

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

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

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

您可以像下面的示例代码那样执行此操作。

 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; } }