已编辑
我有一个自定义的异常类 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)
它不会抛出任何东西! 所以你的例外永远不会被调用!
如果你想捕捉什么,你要么必须修改库!