Java 这种异常处理方法有什么问题吗?

Java 这种异常处理方法有什么问题吗?,java,exception,Java,Exception,我们需要有两个功能。它们做同样的事情,但一个处理异常,另一个抛出异常。注意:如果要处理异常,则必须在下面的commonFunc中处理异常。处理FunctionHandleEx中的异常不起作用,因为要处理该函数,它需要仅在commonFunc中可用的变量。为了重用代码,我们得到了以下结果。你看到它有什么问题吗?我可以看到一个问题是:当IsExceptionHandle为true时,函数抛出异常,但实际上没有抛出异常——但Java允许这样做?有更好的方法吗?我们使用的是Java6。谢谢 public

我们需要有两个功能。它们做同样的事情,但一个处理异常,另一个抛出异常。注意:如果要处理异常,则必须在下面的commonFunc中处理异常。处理FunctionHandleEx中的异常不起作用,因为要处理该函数,它需要仅在commonFunc中可用的变量。为了重用代码,我们得到了以下结果。你看到它有什么问题吗?我可以看到一个问题是:当IsExceptionHandle为true时,函数抛出异常,但实际上没有抛出异常——但Java允许这样做?有更好的方法吗?我们使用的是Java6。谢谢

public void functionThrowsEx() throws Exception e
{
  commonFunc(false);  //false means does not handle exception
}

public void functionHandlesEx()
{
  try
  {
    commonFunc(true); //true means handle exception
  }
  catch (Exception e)
  {
    // do nothing as exception handled
  }
}

private void commonFunc(final boolean isExceptionHandled) throws Exception
{
  try
  {
    ....
  }
  catch (Exception e)
  {
    if (isExceptionHandled)
    {
       //handle the exception
    }
    else
    {
       throw e;
    }
  }
}

这似乎是一种处理异常的过于复杂的方法。我理解它的玩具代码来显示您正在做什么,但我还没有遇到很多创建嵌套调用以处理异常的原因


理想情况下,可能导致异常的代码应该具有处理异常的方法,使用try…catch,甚至可能是finally。这个逻辑流在一个非平凡的应用程序中看起来相当复杂,并且会增加调试的复杂性和难度。

您应该去掉这两个函数,并避免嵌套try/catch块。如果必须嵌套它们,则通过保持相同方法中的逻辑,使其尽可能具有straigtfoward

根据代码,我猜您希望根据程序的状态以不同的方式处理异常。这段代码太复杂,对于一个非平凡的应用程序来说很难理解。更好的方法是保留FunctionHandleEx,并将异常恢复逻辑放在处理程序函数中

public void functionHandlesEx() {
try {
   //logic here;
  }
 }
catch (Exception e) {
 if(iWantToHandleException) {
    //handle exception    
   }
  //do nothing otherwise. Use the finally block for anything else they have in common.
  }
}

这更容易理解,并且将其重构为这种形式应该不会太难。

如果没有真正的异常,IsExceptionHandle是真是假都不重要,它不会被调用。它看起来有效。我假设FunctionHandleEx中的try/catch是一种形式,以防止编译器抱怨未处理或抛出的异常。谢谢你,古德先生!真正的处理是在commonFunc中完成的。你需要两个不同的外部函数,这样FunctionHandleEx就不需要throws子句了。我想不出任何方法来简化它。在Java中,重新触发异常应该可以正常工作。在其他一些环境中,情况并非如此。OP解释说,为了访问内部数据,需要在commonFunc内部处理该函数。请注意,需要两个单独的外部函数,以便一个函数可以有一个throws子句,另一个函数不能有。