当我使用全局异常处理时,为什么必须使用try catch?

时间:2014-09-09 21:22:34

标签: java android try-catch uncaught-exception

我是Java和Android的初学者。我的问题是当我在我的代码中使用setDefaultUncaughtExceptionHandler时,一些函数仍然需要一个围绕它的try / catch块,但我想把所有异常抛给UncaughtException线程。

    public class MyAlarmReciever  extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Thread.setDefaultUncaughtExceptionHandler(new UnCaughtException(context));

        try
        {   
            String imageURL = MyWebService.readFeed();
            DownloadAndSet.downloadFile(imageURL);  
        }
        catch(Throwable e)
        {           
            throw new RuntimeException(e);          
        }

        Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();

     }
}

5 个答案:

答案 0 :(得分:2)

Java区分已检查和未检查的异常。无论如何,已检查的例外必须被捕获。

更正:或者您必须在方法中添加throws子句。这推迟了将异常捕获到方法调用者的冲动。

如果您希望在UncaughtExceptionHandler中处理它们,您可以"转发"它们:

try{ 
   // blah "throws some checked exception type"
} catch ( Throwable e ) {
    // throw e; <- This will not work :( unless you add the "throws" clause.
    throw new RuntimeException(e);
}

不幸的是,只是抛出相同的Exception不会起作用,因为你必须添加你不想要的throws子句。您必须将它包装在RuntimeException中。

答案 1 :(得分:1)

必须捕获代码中的所有已检查异常。

进一步阅读已检查与未经检查的例外:

http://www.javapractices.com/topic/TopicAction.do?Id=129

http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

答案 2 :(得分:0)

当您调用抛出异常的方法时,要求您使用try/catchthrow处理异常相同的异常。

由于您不希望在代码中处理异常并希望所有异常都由Default Exception处理程序处理,因此您需要将throws添加到您不想捕获的所有方法中例外。

答案 3 :(得分:0)

documentation说:

  

设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。

它与您必须捕获的例外无关。必须捕获/抛出的异常示例是IOException。您没有的异常示例是NullPointerException。

因此,如果您的代码导致NullPointerException,则默认处理程序将处理它。如果您的代码(可能)导致IOException,您必须在那里(通过捕获或抛出)处理它。

答案 4 :(得分:0)

我在程序中总是做的是创建一个异常处理程序方法,并在每次创建try/catch块时调用它。很多时候我有Thread.sleep()方法,我只是将异常发送到一个共同的地方进行“全局”处理。在全局异常处理程序中,您也可以参考此方法。

请记住,您可能并不总是想要使用此方法,因为如果文件已经存在,文件流之类的内容可能会抛出错误,并且您希望采用不同的方法,例如将其命名为其他方法,而不仅仅是停止程序。

public static void main(String[] args) {
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            catchException(e);
        }
    });
    try {
        Thread.sleep(1000);// Just an example of a possible exception thrower
    }
    catch (InterruptedException e) {
        catchException(e);
    }
}

public static void catchException(Throwable e) {
    // Deal with the exception here
    System.out.println("Oh no! You broke the program!!!");
    System.out.println("Here is the error btw: " + e.getMessage());
}

如果您使用的是Eclipse,则可以为try/catch块设置默认的自动代码生成,以自动包含此方法: Eclipse Catch Block Body 如果您不希望所有项目都出现此行为,也可以设置项目特定设置。