29. april 2009 - 11:50Der 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
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 }
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...
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.
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){
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.
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.
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?
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.
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.
Synes godt om
Ny brugerNybegynder
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.