Throw Exception in onFailure of LoopJ AndroidAsyncHttp



已编辑

我有一个自定义的异常类 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 块中捕获它。任何想法或帮助将不胜感激。

因为 onFailure 的定义没有指定它抛出任何内容,这意味着它的任何实现都不能抛出检查异常。您可以通过使其扩展RuntimeException来更改MyException,但由于它是运行时异常,因此不需要onFailure的任何调用方捕获异常。如果您是此类的唯一用户,只要您记得自己捕获异常就可以了。

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

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

现在,由于您正在覆盖 onFailure(),并且 AsyncHttpClient 没有 MyException 类的 catch(),所以它根本没有被捕获!

如果你想让它被捕获,请在 onFailure() 中的 try catch 块中写入投掷

try {
  throw MyException();
} catch(MyException e){
 // Exception caught
}

这将起作用,因为您有一个捕获抛出的异常。

接下来,在您的情况下您致电

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

现在要捕获异常,它必须由client.post方法调用抛出!

如果你看一下发布方法

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

它不会抛出任何东西! 所以你的例外永远不会被调用!

如果你想捕捉什么,你要么必须修改库!

相关内容

  • 没有找到相关文章

最新更新