在catch块中返回?

在catch块中有return语句是错误的吗? 有什么select?
即:

public bool SomeFunction() { try { //somecode return true; } catch(Exception ex) { MessageBox.Show(ex.message); return false; } } 

你可以从catch块正常返回。 这通常是很好的function代码。

另一种方法是将返回值存储在一个临时variables中:

 public bool SomeFunction() { bool success = true; try { //somecode } catch(Exception ex) { MessageBox.Show(ex.message); success = false; } return success; } 

但个人而言,我发现你写这个的方式(用一句全部的catch语句)是更可读的。 另一方面,如果你正在期待一个特定的exception,你可能有多个path返回成功与否…

 try { DoTheImportantThing(); DoTheOtherThingThatMightFailButWeDontCare(); } catch (DontCareAboutItException ex) { log.Info(ex); } catch (Exception ex) { log.Error(ex); return false; } return true; 

那么在我看来,你最好尽可能地推迟回报。

作为一个方面的说明,根据应用程序,考虑logging你捕获的exception,而不是只显示给用户。 logging的exception比用户对所发生事件的叙述更可靠。

如果在try块中已经有一个return语句,我可能会把另一个返回放在函数的末尾:

 try { //somecode return true; } catch(Exception ex) { MessageBox.Show(ex.message); } return false; 

这是为了避免多重返回,如果需要处理多个exception。

没关系,只要记住,一些代码可能在返回指令后执行(返回值ll兑现)。

  try { return; } catch(Exception ex) { return; } finally { //some code } 
 public bool SomeFunction() { try { //somecode return true; } catch(Exception ex) { MessageBox.Show(ex.message); } return false; } 

就我个人而言,我将return语句放在方法的底部,而不是放在catch-block中。 但都很好。 这完全取决于组织中的可读性(主观)和准则。

这没有错,但是如果你使用了一个资源,通常finally块会被用来closures它,而不是两次调用close方法。 在这种情况下,你可以select在finally块之后使用return语句。

是的,这很正常。

不要忘了,你也可以使用finally块来返回后执行。

一般不这样做。 问题是,在视觉和技术上,捕获的逻辑要求退出捕获块。 例如,如果你有最后的阻止,你认为这个代码会给你什么?

  int Test(out int t) { int i = 1; t = 1; try { if(DateTime.Now.Second < 58) throw new Exception(); } catch (Exception) { return i; } finally { i = 2; t = 2; } return -1; } 

答案:即使t = 2发生在i = 2之后,i = 1但是t = 2。

正如你所看到的,“返回执行后无代码”的视觉和技术规则被破坏了。

对我来说,对于一个在成功时返回true而在失败时返回false的函数,是完全有意义的。 我希望它没有错 – 我一直这样做:)

catch块的主要目的是提供一个可以在try块中发生exception情况的地方。 所以你遇到了一个exception,继续…并从一个方法返回。 如果调用方法不关心exception,这是绝对正常的。