2015-01-12 2 views
-1

ОтредактированоThrow Исключение в OnFailure из LoopJ AndroidAsyncHttp

У меня есть пользовательский класс 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 и не поймав его в улове блока. Любая идея или помощь будут оценены.

+0

Напишите другой способ, который вызывает исключение! назовите его с ошибкой –

+0

, пожалуйста, уточните? зачем создавать функцию только для того, чтобы вызывать исключение RuntimeException, когда я уже добавил бросить новое RunTimeException? –

ответ

0

Поскольку определение onFailure не указывает, что оно выбрасывает что-либо, это означает, что ни одна из его реализаций не может выставить проверенное исключение. Вы можете изменить свой MyException, сделав его расширенным RuntimeException, но поскольку это исключение во время выполнения, любые вызывающие абоненты onFailure не не нуждаются в, чтобы поймать исключение. Если вы единственный пользователь этого класса, это прекрасно, если вы не забыли сами поймать это исключение.

+0

Я попытался расширить MyException до RuntimeException, но я не могу его поймать.Eclipse даже не предлагает мне добавить блок catch try. Хотя я добавил блок try/catch вручную вокруг родительской функции, но не использует. –

+0

Вы можете поймать его просто отлично, только вы не * обязательны * к (потому что это исключение во время выполнения). Обратите внимание, что это вызовет исключение, которое должен вызвать * вызывающий элемент 'onFailure'. Если это не так, выброс исключения не будет вызывать какие-либо из ваших выводов. –

+0

Не могли бы вы рассказать мне, кто является вызывающей стороной onFailure? Я искал его, но не смог найти ответ. Я новичок в этом. –

0

У вас отсутствует базовая концепция Java, вы добавили предложение throw в свой onFailure(), но исходное определение метода не знает, что делать, если что-то бросается!

В основном, когда вы используете ключевое слово throw и генерируете исключение, это исключение должно быть уловлено в том месте, где вызывается метод.

Теперь, поскольку вы переопределяете onFailure(), и AsyncHttpClient не имеет catch() для вашего класса MyException, поэтому его просто не удается поймать!

Если вы хотите получить его поймают, напишите бросок внутри улова блока попробовать в вашем OnFailure()

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) 

Он не бросает что-нибудь! поэтому ваше исключение никогда не будет вызвано!

И в случае, если вы хотите что-то поймать, вам придется либо модифицировать библиотеку!

+0

Я добавил блок catch для MyException, вы можете увидеть Обновленный вопрос. Можете ли вы написать фрагмент кода здесь? –

+0

вы не понимаете, в вашем блоке catch вы можете client.post, теперь метод post внутренне вызывает onFailure и onSuccess, теперь в вашем onFailure вы генерируете исключение, но onFailure не знает, что делать, если исключение , поэтому он будет передавать исключение на вызов client.post(), и ваш блок try никогда не поймает его! –

+0

затем где его добавить? это мой вопрос. Где добавить блок catch точно ... Укажите мне, пожалуйста. –