如果我有一个返回某些东西的方法,比如
public DataTable ReturnSomething()
{
try
{
//logic here
return ds.Tables[0];
}
catch (Exception e)
{
ErrorString=e.Message;
}
}
这会产生编译器错误,显然是因为catch{}
块没有返回任何内容。
所以当我有返回值的方法时,我不使用try-catch块,这是一种不好的做法。如果有错误,我想将错误字符串设置为该错误。但是我还需要一个返回值。建议吗?
答案 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;
}
}