在LoopJ AndroidAsyncHttp的onFailure中抛出异常

时间:2015-01-12 07:48:47

标签: java android-async-http

被修改

我有一个自定义的Exception类MyException

public class MyException extends RunTimeException{

    public MyException()
    {
       super();
    }

    public MyException(String message)
    {
        super(message);
    }

    public MyException(Exception e)
    {
        super(e);
    }
}

现在每当引发异常时,我都会在MyException中捕获它并将其抛回父函数。我正在使用AsyncHttpClient时遇到问题,并且它在onFailure中引发异常,因为它是由服务器引发的。

这就是我发布HTTP请求并尝试处理异常的方法。

AsyncHttpClient client = new AsyncHttpClient();

    client.setTimeout(TIMEOUT);

    try {
        client.post(mainActivity,
                PATH, new StringEntity(requiredDataForRequest),
                "application/json", new AsyncHttpResponseHandler() {

                    @Override
                    public void onSuccess(String response) {

                    }

                    @Override
                    public void onFailure(int arg0, Header[] arg1,
                            byte[] arg2, Throwable e) throws MyException {
                        throw new MyException("Error Description Here!");
                    }

                });
    } catch (MyException e) {
        log.debug("Exception: " + e.getMessage());
    }

现在它正在崩溃我的应用抛出新的MyException 而没有在 catch 块中捕获它。任何想法或帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

因为onFailure的定义没有指定它抛出任何东西意味着它的任何实现都不能抛出一个已检查的异常。您可以通过扩展MyException来更改RuntimeException,但由于它是运行时异常,因此onFailure的所有呼叫者都不是必需来捕获异常。如果你是这个班级的唯一用户,那么只要你记得自己捕捉到这个例外就没问题。

答案 1 :(得分:0)

你在这里缺少基本的java概念,你在你的onFailure()中添加了一个throw子句,但原始方法定义不知道如果抛出某些东西该怎么办!

基本上,当您使用throw关键字并抛出异常时,必须在调用方法的位置捕获此异常。

现在,因为你要覆盖onFailure()并且AsyncHttpClient没有为你的MyException类捕获()所以它根本就没有被捕获!

如果你想抓住它,在你的onFailure()

中写一个try catch块内的throw
try {
  throw MyException();
} catch(MyException e){
 // Exception caught
}

这将有效,因为你有一个引发抛出的异常。

接下来,在你的情况下你打电话

try {
 client.post(///);
} catch (MyException e) {
  // exception caught
}

现在要抓住异常,必须通过client.post方法调用抛出它!

如果你看一下post方法

public RequestHandle post(android.content.Context context,
                 java.lang.String url,
                 org.apache.http.HttpEntity entity,
                 java.lang.String contentType,
                 ResponseHandlerInterface responseHandler)

它不会抛出任何东西!所以永远不会调用你的异常!

如果您想要抓住某些内容,您将需要修改该库!