2011-10-10 196 views
1

这是一个通用的编程问题,不涉及任何特定的语言。返回值与返回错误代码?

一个新的程序员通常会写,计算某个值的方法,然后返回值:

public Integer doSomething() 
{ 
    // Calculate something 
    return something; 
} 

public void main() 
{ 
    Integer myValue = doSomething(); 
} 

但当something计算过程中发生异常,什么是处理异常的最佳方式特别是在提供用户反馈时?如果您尝试计算something,并且发现异常,您会返回什么结果?没有什么计算,所以你返回null?一旦你返回它(不管它是什么),你是否需要在父方法中做另一个try/catch来检查是否返回了有效值?如果没有,那么确保用户得到一些反馈?

我已经听到关于永远不会返回值的表的参数,而是将计算值设置为指针或全局变量,而是仅从方法返回错误代码,然后(在父方法中)仅处理相应的错误代码。

是否有最佳做法或方法呢?有没有什么好的资源可以让我们更好地了解处理这个问题的最佳方法?

更新澄清

考虑下面的代码:

public void main() 
{ 
    int myValue = getMyValue(); 

    MyUIObject whatever = new MyUIObject(); 
    whatever.displayValue(myValue); // Display the value in the UI or something 
} 

public Integer getMyValue() 
{ 
    try 
    { 
    // Calculate some value 
    } catch (exception e) { 
    // ?? 
    } 
    return value; 
} 

我调用该方法得到一些int值,然后我回去。回到main(),我做了一些有价值的事情,比如在本例中的Log中显示它。通常我会在用户界面中显示该值。

不管怎么说,如果在getMyValue()中发现异常,value也会返回,但它是空的?那么main()会发生什么呢?我是否还必须测试main()中的有效值?

我需要程序来相应地处理错误并继续。下面的人建议在getMyValue()方法中在UI中显示适当的信息。我看到两个潜在的问题:

  1. 看来我将混合业务逻辑与(在这种情况下)用户界面的逻辑。
  2. 我将不得不将MyUIObject的引用传递给getMyValue(),或者我可以从函数内部访问它。在上面这个简单的例子中,没有什么大不了的,但是如果有一组UI元素需要更新或者根据getMyValue()发生的变化进行更改,传递它们都可能有点多...

我读过一堆关于所有这些基本原理的文章,但似乎无法找到上述情况的直接答案。我感谢任何帮助或见解。

+0

这是什么语言?然后,我们可以给你更具体的参考。 – jwd

+0

你可以假装它是Java。 –

回答

2

我觉得你不太理解异常。

如果抛出一个异常,你就无法正常功能回报:

public Integer doSomething() 
{ 
    throw new my_exception(); 
    // The following code does NOT get run 
    return something; 
} 

public void main() 
{ 
    Integer myValue = doSomething(); 
} 

例外的主要优点是:

  • 你可以写你的代码,仿佛一切都是成功,这通常更清晰
  • 例外情况很难忽视。如果异常未处理,通常会出现一个明显的大声错误,并带有堆栈跟踪。这与错误代码形成对比,其中更容易忽略错误处理。

我推荐this post by Eric Lippert,它讨论了异常以及它是什么时候并且不适合处理它们。


UPDATE(响应评论):

您可以完全处理异常,并继续,您可以通过捕捉异常做到这一点。

如:

try 
{ 
    // Perform calculation 
} 
catch (ExceptionType ex) 
{ 
    // A problem of type 'ExceptionType' occurred - you can do whatever you 
    // want here. 
    // You could log it to a list, which will be later shown to the user, 
    // you could set a flag to pop up a dialog box later, etc 
} 

// The code here will still get run even if ExceptionType was thrown inside 
// the try {} block, because we caught and handled that exception. 

关于这样做的好处是,你知道什么样的东西出了问题(从异常类型),以及信息(通过寻找到ex的信息),所以你希望得到你需要的信息来做正确的事情。


更新2响应您的编辑:

你应该在你可以在你所希望的方式来响应,其中层处理异常。对于你的例子,你是对的,你不应该捕捉到代码中很深的异常,因为你无法访问UI等,因此你不能真正做任何有用的事情。

有关此版本的您的示例代码如何:

public void main() 
{ 
    int myValue = -1; // some default value 
    String error = null; // or however you do it in Java (: 

    try 
    { 
    getMyValue(); 
    } 
    catch (exception e) 
    { 
    error = "Error calculating value. Check your input or something."; 
    } 

    if (error != null) 
    { 
    // Display the error message to the user, or maybe add it to a list of many 
    // errors to be displayed later, etc. 
    // Note: if we are just adding to a list, we could do that in the catch(). 
    } 

    // Run this code regardless of error - will display default value 
    // if there was error. 
    // Alternatively, we could wrap this in an 'else' if we don't want to 
    // display anything in the case of an error. 
    MyUIObject whatever = new MyUIObject(); 
    whatever.displayValue(myValue); // Display the value in the UI or something 
} 

public Integer getMyValue() 
{ 
    // Calculate some value, don't worry about exceptions since we can't 
    // do anything useful at this level. 
    return value; 
} 
+0

如果我需要程序继续正常工作,但可能显示某个值未正确计算,会发生什么情况?例如,假设我有一个具有5个不同的计算值并显示的值。如果在计算其中一个值时出现异常,我想以某种方式通知UI中的用户,但我希望该程序继续工作,并仍然按照预期计算其他值。我不希望我的程序停止工作......我该如何处理这个问题? –

+0

@Jakobud:我更新了我的回答以解答您的评论 - 这有帮助吗? – jwd

+0

已为您更新的问题。 –

0

您写道:

我听到的论点在桌子上的左右两边从来没有返回值可言,而是设置计算值作为指针或全局变量,而是仅从方法返回错误代码,然后(在父方法中)相应地处理错误代码。

[编辑] 其实,EXCETION可以被看作是错误的代码,这与相关消息一起来临,你作为程序员应该知道你的异常必须被捕获,处理并最终显示到用户。只要让异常传播(在被调用的函数堆栈中向下),就不会使用返回值,因此您不必关心处理相关的遗漏值。良好的异常处理是一个相当棘手的问题。

由于jwd回答,我没有看到在一个方法中引发异常,然后在同一个方法中处理excation以仅返回一个错误值。澄清:

public Integer doSomething(){ 

    try{ 

     throw new my_exception();} 

    catch{ return err_value;} 

    } 

是毫无意义的。

+0

你说使用全局变量和指针而不使用异常是最佳做法吗?这很疯狂!还是仅仅是我误解了你写的内容? –

+0

我实际上是在用Java思考,在那里例外被视为错误...我应该编辑我的帖子:p – ThanksForAllTheFish

+0

如果你说'error'并且想到'exception',很难理解你的意思。 ;-) btw。 Java是一个非常好的例子,为什么异常要比返回错误代码好得多。它使代码更安全。 –

0

异常是面向对象语言(OOL)的一种属性。如果你使用OOL,你应该更喜欢异常。它比返回错误代码好得多。您可以找到很好的例子,说明错误代码方法如何生成比基于异常的代码长得多的源代码。例如,如果您想要读取文件并对其执行某些操作并保存为其他格式。你可以在没有异常的情况下用C语言来完成,但是你的代码将充满if(error)...语句,也许你会尝试使用一些goto语句,也许一些宏使得它更短。但也绝对不透明,很难理解。你也可以经常忘记测试返回值,以免看到错误和程序继续。这不好。另一方面,如果您使用OOL编写并使用异常,则源代码将着重于“没有错误时应该怎么做”以及错误处理位于不同的位置。只需一个错误处理代码就可以解决许多可能的文件错误源代码更短,更清晰等。

我个人绝不会尝试返回面向对象语言中的错误代码。一个例外是C++,其中异常系统有一些限制。