Avatar billede zorkmontana Nybegynder
29. april 2009 - 11:50 Der er 10 kommentarer og
1 løsning

exception uden stacktrace

Hej

Jeg sidder og leger med noget java exception handler.
naar jeg forbinder til en server fx og serveren ikke eksistere skal den bare printe : not connected.
eller maaske en anden fejl ioexception
saa skal den bare printe: IOFEJL uden stacktrace

er det muligt?
Avatar billede mcb2001 Nybegynder
29. april 2009 - 13:13 #1
Du skal pakke din forespørgsel ind i en try/catch og så gribe den exception der kan kastes. Jeg tror næsten dit problem kan løses således:

try
{
//Connect to server
}
catch(SocketTimeoutException)
{
//DET ER HER DU GERNE VIL UDSKRIVE "not connected".
//Forbindelsen gav en timeout, behandel denne.
}
catch(IOException exc)
{
//Der er opstået en normal IO fejl, behandel denne
}
Avatar billede zorkmontana Nybegynder
29. april 2009 - 13:19 #2
ja, men hvad hvis du gerne vil bruge den almindelige throw metode til at hente de forskellige ud og behandle dem?
Avatar billede mcb2001 Nybegynder
29. april 2009 - 13:34 #3
Jamen et eller andet sted skal du jo gribe det du kaster.
Bruger du throws/throw så skal du stadig insætte catch for at gribe den.
Du kan jo heller ikke kaste et æg op i luften og tro at den ikke skal gribes igen.
Laver du f.eks. en "throws" i din metode, så er det fordi du vil flytte catch til et andet object som så skal tage stilling til hvordan det skal behandles. Men gribes skal det...
Avatar billede zorkmontana Nybegynder
29. april 2009 - 14:24 #4
undskyld skulle nok lige have smidt dette op ogsaa det forklare nok lidt mere

    public void makeConnection() throws LogException {
        // open a socket connection
        try {
            socket = new Socket(serverAddress, serverPort);
            this.oos = new ObjectOutputStream(socket.getOutputStream());
            this.ois = new ObjectInputStream(socket.getInputStream());
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            throw new LogException("makeConnection", "ERROR1", "The Host is Unknown");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new LogException("makeConnection", "ERROR2", "Input Output error from Streams");
        } catch (Exception e){
            throw new LogException("makeConnection", "ERROR3", "Unknown error, This should not happen");
        }
        // open I/O streams for objects
    }

det min LogException goer er at tage tingene og printe, den extender Exception.
jeg faar et stacktrace hver gang den udskriver en fejl og det vil jeg undgaa.

her er LogException:

package domain.mediator;
import java.util.ArrayList;
import java.util.List;

public class LogException extends Exception {

    static boolean heavyLog = false;

    protected List<InfoItem> infoItems =
        new ArrayList<InfoItem>();

    protected class InfoItem{
        public String errorContext = null;
        public String errorCode  = null;
        public String errorText  = null;
        public InfoItem(String contextCode, String errorCode,
                String errorText){

            this.errorContext = contextCode;
            this.errorCode  = errorCode;
            this.errorText  = errorText;
        }
    }


    public LogException(String errorContext, String errorCode,
            String errorMessage){

        //addInfo(errorContext, errorCode, errorMessage);
        System.out.println("[" + errorContext + ": " + errorCode + "-> " + errorMessage + "]");
    }

    public LogException(String errorContext, String errorCode,
            String errorMessage, Throwable cause){
        super(cause);
        addInfo(errorContext, errorCode, errorMessage);
    }

    public LogException addInfo(
            String errorContext, String errorCode, String errorText){

        this.infoItems.add(
                new InfoItem(errorContext, errorCode, errorText));
        return this;
    }

    public String getCode(){
        StringBuilder builder = new StringBuilder();

        for(int i = this.infoItems.size()-1 ; i >=0; i--){
            InfoItem info =
                this.infoItems.get(i);
            builder.append('[');
            builder.append(info.errorContext);
            builder.append(':');
            builder.append(info.errorCode);
            builder.append(']');
        }

        return builder.toString();
    }

    public String toString(){
        StringBuilder builder = new StringBuilder();

        builder.append(getCode());
        builder.append('\n');


        //append additional context information.
        for(int i = this.infoItems.size()-1 ; i >=0; i--){
            InfoItem info =
                this.infoItems.get(i);
            builder.append('[');
            builder.append(info.errorContext);
            builder.append(':');
            builder.append(info.errorCode);
            builder.append(']');
            builder.append(info.errorText);
            if(i>0) builder.append('\n');
        }

            //append root causes and text from this exception first.
            if(getMessage() != null) {
                builder.append('\n');
                if(getCause() == null){
                    builder.append(getMessage());
                } else if(!getMessage().equals(getCause().toString())){
                    builder.append(getMessage());
                }
            }
            appendException(builder, getCause());
        return builder.toString();
    }

    private void appendException(StringBuilder builder, Throwable throwable){
        if(throwable == null) return;
        appendException(builder, throwable.getCause());
        builder.append(throwable.toString());
        builder.append('\n');
    }
}

haaber det hjaelper mere til forstaaelsen ;)
Avatar billede mcb2001 Nybegynder
29. april 2009 - 14:40 #5
Hvorfor smider du en exception hvis du ikke vil gribe den i et andet objekt?

Du kaster en LogExceptions ud i det blå når metoden "makeConnection()" - hvor griber du denne?
For i så fald er det der hvor du griber den du skal udskrive fejlen.

Ydermere vil jeg holde fast i at i "makeConnection()" skal du skrive følgende ind før din catch af IOException:
catch(SocketTimeoutException)
{
throw new LogException("makeConnection", "ERROR4", "Netværksforbindelsen gav timeout inden der kunne oprettes forbindelse");
}

Men hvis du bare vil udskrive information omkring hvad der sker, hvorfor så ikke bare bruge:
System.out.println("ERROR1: The Host is Unknown");
System.out.println("ERROR2: Input Output error from Streams");
System.out.println("ERROR3: Unknown error, This should not happen");

Gav det bedre mening?

Ellers må du prøve at forklare nærmere hvor det er du vil have hvad udskrevet og i hvilket tilfælde.
Avatar billede odsgaard Praktikant
29. april 2009 - 15:45 #6
Umiddelbart kan jeg heller ikke se, hvorfor du kaster exceptions fra din catch blok. Jeg læser det som om, du ønsker, at have en log med de forskellige hændelser. Prøv at kigge på log4j - så kan du nemt gemme forskellige hændelser i en logfil -> fx ved at skrive:

log.error("makeConnection. Netværksforbindelsen gav timeout inden der kunne oprettes forbindelse");

Så behandler log4j hændelsen udfra de parametre du giver den i en config fil.

Kig på http://logging.apache.org/log4j/1.2/index.html

Jeg kan godt hjælpe dig med opsætningen af log4j med en enkel xml config fil.

hilsen
Brian
Avatar billede zorkmontana Nybegynder
29. april 2009 - 16:30 #7
odsgaard -> det er fordi jeg gerne vil have flere forskellige log niveauer jeg gerne vil haandtere dem paa den maade.

mcb2001 -> jeg kan godt se hvad du mener men den guide jeg kiggede paa forklarede ikke saerlig godt hvordan man gjorde det med at gribe de kastede objekter, har du evt. et ordenlig sted hvor jeg kan laese om det?

hilsen
Anders
Avatar billede mcb2001 Nybegynder
29. april 2009 - 16:38 #8
Avatar billede odsgaard Praktikant
29. april 2009 - 20:20 #9
med log4j har du også flere niveauer af logning (debug, info, warn, error, fatal) Det er også muligt at du kan oprette dine egne log-niveauer. Det er også muligt, at filtrere loghændelserne (udfra log niveau eller nøgleord) til forskellige outputenheder - console, socket, file og syslog.

/Brian
Avatar billede zorkmontana Nybegynder
30. april 2009 - 08:49 #10
undskyld jeg ikke lige svarede tilbage igaar men mit net gik ned.
jeg vil lige kigge lidt mere ind i jeres forslag og vende tilbage
Avatar billede zorkmontana Nybegynder
31. maj 2009 - 22:16 #11
jeg endte med at lave det helt om.
acquaintance
Jeg lavede en acquaintance pakke og lægge en stak interfaces i og ellers køre resten med try catch, da der var nogle ting jeg gerne ville have men andre jeg gerne ville undvære efter valg. som trace stack mm.
men kunne i ikke begge smide et svar så i kan få noget ud af det syndes i begge har fortjænt det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester