Exception 返回值与返回错误代码?

Exception 返回值与返回错误代码?,exception,exception-handling,error-handling,error-code,Exception,Exception Handling,Error Handling,Error Code,这是一个一般编程问题,不涉及任何特定语言。 新程序员通常会编写一个方法来计算某个值,然后返回该值: public Integer doSomething() { // Calculate something return something; } public void main() { Integer myValue = doSomething(); } 但是,当在计算某物时发生异常时,处理异常的最佳方法是什么,特别是在向用户提供反馈时?如果您对某物的计算进行尝试/捕获,如

这是一个一般编程问题,不涉及任何特定语言。

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

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

public void main()
{
  Integer myValue = doSomething();
}
但是,当在计算
某物时发生异常时,处理异常的最佳方法是什么,特别是在向用户提供反馈时?如果您对
某物的计算进行尝试/捕获,如果捕获到异常,您将返回什么?未计算任何内容,因此是否返回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()
,我对这个值做了一些处理,比如在本例中在日志中显示它。通常我会在UI中为用户显示值

无论如何,如果在
getMyValue()
中捕获到异常,
value
也会返回,但它是空的吗?那么在
main()
中会发生什么?我是否也必须测试它是否是
main()
中的有效值

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

  • 看起来我将把业务逻辑与UI的逻辑(在本例中)混合在一起
  • 我必须将
    MyUIObject
    的引用传递给
    getMyValue()
    或其他对象,以便从函数中访问它。在上面的简单示例中,这没什么大不了的,但是如果有一堆UI元素需要根据
    getMyValue()
    中发生的情况进行更新或更改,那么将它们全部传递可能会有点太多

  • 我已经读了很多关于所有这些基本原理的书,但对于上述情况,我似乎找不到一个直接的答案。非常感谢您的帮助或见解。

    我想您不太了解例外情况

    如果引发异常,则通常不会从函数返回:

    public Integer doSomething()
    {
       throw new my_exception();
       // The following code does NOT get run
       return something;
    }
    
    public void main()
    {
      Integer myValue = doSomething();
    }
    
    例外情况的主要优点是:

    • 您可以像一切都在成功一样编写代码,这通常更清晰
    • 例外情况很难被忽视。如果一个异常未被处理,通常会给出一个明显而响亮的错误,并带有堆栈跟踪。这与错误代码形成对比,在错误代码中忽略错误处理比不忽略要容易得多
    我推荐,它讨论异常以及何时处理异常和何时处理异常


    更新(回应评论):

    您完全可以处理异常并继续,您可以通过捕获异常来实现这一点

    例如:

    这样做的好处是,您知道发生了什么样的错误(从异常类型),以及详细信息(通过查看
    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;
    }
    
    你写道:

    我在表的两边都听到过关于根本不返回值的争论,而是将计算值设置为指针或全局变量,只从方法返回错误代码,然后(在父方法中)简单地相应地处理错误代码

    [编辑] 实际上,异常可以被看作是错误代码,伴随着相关的消息,作为程序员,您应该知道异常必须在哪里被捕获、处理并最终显示给用户。只要允许异常传播(在被调用函数堆栈中向下),就不会使用返回值,因此不必关心处理相关的遗漏值。良好的异常处理是一个相当困难的问题

    正如jwd回答的那样,我不认为在方法中引发异常,然后在同一方法中处理excation以返回错误值有什么意义。澄清:

     public Integer doSomething(){
    
         try{
    
             throw new my_exception();}
    
         catch{ return err_value;} 
    
         }
    

    异常是面向对象语言(OOL)的一个属性。如果您使用OOL,您应该更喜欢异常。这比返回错误代码要好得多。您可以找到很好的示例,说明错误代码方法如何生成比基于异常的代码长得多的源代码。例如,如果您想读取文件并对其执行某些操作,然后以不同的格式保存。您可以在C中毫无例外地执行此操作,但您的代码将充满if(error)。。。语句,也许你会尝试使用一些goto语句,也许一些宏来缩短它。但也绝对不透明,难以理解。此外,您常常会忘记测试返回值,这样就看不到错误,程序就会继续运行。那不好。另一方面,如果您在OOL中编写并使用异常,那么您的源代码将重点放在“没有错误时该做什么”,错误处理将在di中进行
     public Integer doSomething(){
    
         try{
    
             throw new my_exception();}
    
         catch{ return err_value;} 
    
         }