Forçando usar a minha Exception [ Resolvido ]

Olá pessoal.

Eu criei várias classes Exception para minha biblioteca lançar as próprias exceptions. Mas eu estou usando outra biblioteca por baixo e ela dispara suas exceptions.

Como eu faço para minha bilbioteca lançar as minhas exceptions primeiro?

Abraços.

Sua biblioteca terá que capturar as exception e repassa-las, como suas exceptions:

try { stmt.executeQuery(query); //Exceção original } catch (SQLException e) { throw new DeuPauNoSQLException(e); //Exceção da sua biblioteca }

ClasseException ex = new ClasseException();

throw ex;

Espero ter ajudado.

Abraço!

Olá pessoal.

Obrigado pelas respostas. Eu fiz isso mas não deu certo, ele ainda está lançando o exception da biblioteca. Vou postar o código:

try { asteriskServer = new DefaultAsteriskServer(Configuration.getHost(), Configuration.getUser(), Configuration.getPassword()); } catch (ManagerCommunicationException ex) { throw new ConnectionException("Teste"); }

Esse ConnectionException eu criei. Ele está lançando a exception da biblioteca ainda, vejam:

[quote]Exception in thread “main” org.asteriskjava.live.ManagerCommunicationException: Unable to login: Operation timed out
at org.asteriskjava.live.internal.AsteriskServerImpl.initializeIfNeeded(AsteriskServerImpl.java:196)
at org.asteriskjava.live.internal.AsteriskServerImpl.getChannels(AsteriskServerImpl.java:417)
at org.asteriskjava.live.DefaultAsteriskServer.getChannels(DefaultAsteriskServer.java:209)
at br.com.agileti.smartframework.asterisk.call.SingleMakeCall.call(SingleMakeCall.java:90)
at br.com.agileti.smartframework.asterisk.call.Teste.main(Teste.java:34)[/quote]

Estranho. E a linha 34 é essa dentro do try?

E você tem certeza que a exception que você está capturando é a mesma que está ali no stacktrace (confira se o pacote também está certo).

Essa linha 34 é da classe Teste, que tem um método main que chama um método e esse método lança a exception.

Eu conferi, inclusive (pra ficar mais estranho ainda), eu usei o Exception no try catch, ou seja, qualquer exception ele lança pro meu exception, e mesmo assim não funcionou.

Dei uma googlada e o esquema parece ser esse mesmo.

Alguma idéia?

Manda o método inteiro que trata/lança essa exceção.

E essa ConnectionException está como?

Essa exception não é uma RuntimeExcpetion lançada de uma Thread?

Lá vai o método main:

try { SingleMakeCall makeCall = new SingleMakeCall(); makeCall.call(); } catch (ApplicationException ex) { ex.printStackTrace(); } catch (CallException ex) { ex.printStackTrace(); } catch (ConnectionException ex) { ex.printStackTrace(); }

O ConnectionException está assim:

[code]public class ConnectionException extends Exception {

private String error;

public ConnectionException() {
    super();
    error = "Nao foi possivel conectar ao servidor";
}

public ConnectionException(String e) {
    super(e);
    error = e;
}

public String getError() {
    return error;
}

}[/code]

Felagund eu vasculhei o código da biblioteca, ele é um método syncronized. Acho que ele está sendo lançado por uma Thread :frowning:

Será esse o problema?

[Removi o conteúdo pois peguei o bonde andando e falei coisa errada] :smiley:

Posta essa classe SingleMakeCall

Pelo menos o método call

Olá. Segue o método call:

[code]public void call() throws CallException {
final AsteriskServer asteriskServer = getAsteriskServer();

    ApplicationVisitor<OriginateAction> visitor = new ApplicationVisitor<OriginateAction>() {
        public OriginateAction visit(AnswerApp answer) {
            throw new UnsupportedOperationException();
        }

        public OriginateAction visit(DialApp dial) {
            OriginateAction action = new OriginateAction();
            action.setChannel(dial.getProtocolo() + "/" + TelefoneUtils.cleanFormat(dial.getDestino()));

            if (dial.getPlayback() != null) {
                action.setApplication("Playback");
                action.setData(dial.getPlayback().getParametro());
            }

            action.setTimeout(30000L);
            action.setCallerId(dial.getCallerId());
            action.setExten(dial.getOrigem());

            return action;
        }

        public OriginateAction visit(HangupApp hangup) {
            throw new UnsupportedOperationException();
        }

        public OriginateAction visit(PlaybackApp playback) {
            throw new UnsupportedOperationException();
        }

        public OriginateAction visit(SystemApp system) {
            throw new UnsupportedOperationException();
        }
    };

    OriginateAction action = application.accept(visitor);

    AsteriskChannel asteriskChannel = asteriskServer.originate(action);

    if (asteriskChannel.wasBusy()) {
        throw new CallException("Linha ocupada, tente novamente mais tarde!");
    }

}[/code]

Esse stack

[quote]Exception in thread “main” org.asteriskjava.live.ManagerCommunicationException: Unable to login: Operation timed out
at org.asteriskjava.live.internal.AsteriskServerImpl.initializeIfNeeded(AsteriskServerImpl.java:196)
at org.asteriskjava.live.internal.AsteriskServerImpl.getChannels(AsteriskServerImpl.java:417)
at org.asteriskjava.live.DefaultAsteriskServer.getChannels(DefaultAsteriskServer.java:209)
at br.com.agileti.smartframework.asterisk.call.SingleMakeCall.call(SingleMakeCall.java:90)
at br.com.agileti.smartframework.asterisk.call.Teste.main(Teste.java:34)[/quote]

Não está condizente com o método que vc postou… tem algo errado aí

da classe SingleMakeCall método call… é chamado um DefaultAsteriskServer.getChannels… mas nesse seu código nao tem isso…

Putz que mancada, agora que eu lembrei que eu tinha colocado esse getChannels pra testar uma coisa, dae eu apaguei depois.

Mesmo tirando ele da erro. Eis o stack “correto”:

[quote]Exception in thread “main” org.asteriskjava.live.ManagerCommunicationException: Unable to login: Operation timed out
at org.asteriskjava.live.internal.AsteriskServerImpl.initializeIfNeeded(AsteriskServerImpl.java:196)
at org.asteriskjava.live.internal.AsteriskServerImpl.originate(AsteriskServerImpl.java:291)
at org.asteriskjava.live.DefaultAsteriskServer.originate(DefaultAsteriskServer.java:137)
at br.com.agileti.smartframework.asterisk.call.SingleMakeCall.call(SingleMakeCall.java:88)
at br.com.agileti.smartframework.asterisk.call.Teste.main(Teste.java:34)[/quote]

O servidor está desligado para dar erro de conexão mesmo.

Galera, descobri o problema. Tava na nossa cara hehe. O Exception estava sendo lançado pelo método call do SingleMakeCall. E eu estava colocando o try/catch forçado em outro lugar, na classe que faz a conexão. Por isso não estava indo. Segue o stack corretissimo:

[quote]br.com.agileti.smartframework.asterisk.exception.ConnectionException: Teste
at br.com.agileti.smartframework.asterisk.call.SingleMakeCall.call(SingleMakeCall.java:96)
at br.com.agileti.smartframework.asterisk.call.Teste.main(Teste.java:34)[/quote]

Valeu pela ajuda de vocês.

Abraços

o método visit em ApplicationVisitor não tem try-catch. Coloque um try-catch ai.
o método call não tem try-catch. coloque um ai.

Vc tem que colocar try-catch em todos os métodos que chama a biblioteca de terceiros. Todos.

E fazer o tratamento adquado. o padrão ExceptionHandler pode ajudá-lo a simplificar essa tarefa.

Q Pilantra… tava pondo outro stack pra ver se a gente tava atento …hehehe

Até mais cara…

[quote=sergiotaborda]o método visit em ApplicationVisitor não tem try-catch. Coloque um try-catch ai.
o método call não tem try-catch. coloque um ai.

Vc tem que colocar try-catch em todos os métodos que chama a biblioteca de terceiros. Todos.

E fazer o tratamento adquado. o padrão ExceptionHandler pode ajudá-lo a simplificar essa tarefa.[/quote]

Show de bola! Vou aproveitar (usurpar) algumas idéias =P

hehehehehe!!! valeu pessoal!!! ta ficando bonito o negócio agora!!!