Avatar billede funkyloonie Nybegynder
29. december 2004 - 11:53 Der er 15 kommentarer og
2 løsninger

Fejl håndtering

Hej

Jeg sidder og overvejer hvordan jeg laver den bedste logging af eventuelle fejl i et system. De fejl jeg fanger skrives i en log-fil. Der kan dog godt opstå fejl som ikke fanges, dvs hvis koden ikke er omkranset af try...catch.

Er der en mulighed/smart måde at at tilføje en enkelt try...catch f.eks i programmets main som vil fange resterende fejl som ikke kræver try...catch som nullPointerExceptions og parseerrors ?
Avatar billede repsak Nybegynder
29. december 2004 - 12:04 #1
Du kan godt lave try-catch omkring main, men det er ikke særlig fornemt... Men du bør da omkranse de 'risikofyldte' stedet med try/catch. Iøvrigt bør du sørge for at lave generelle kontroller såsom:
if(minVar != null)
//udfør opgave
else //håndtér fejl
så undgår du også for mange try/catch
Sørg for at din algoritmer er 100% korrekte - det hjælper dig senere hen :-)
Avatar billede funkyloonie Nybegynder
29. december 2004 - 12:10 #2
for at fejlene vil "nå" ud til main, er det så ikke nødvendigt at klasserne "throws anyException" ?
Avatar billede arne_v Ekspert
29. december 2004 - 12:11 #3
Du kan godt catche unchecked (runtime) exceptions.

Hvis du kun vil logge og terminere programmet ved unchecked (runtime) exceptions,
så er en try catch i main den nemmeste løsning.
Avatar billede arne_v Ekspert
29. december 2004 - 12:12 #4
Nej - all metoder kan smide runtime exceptions og de bliver
propageret normalt.
Avatar billede funkyloonie Nybegynder
29. december 2004 - 12:13 #5
Jeg bruger også de "huske-regler" som du har men for at gøre debugging endnu bedre er jeg jo nødt til at skrive eventuelle fejl i en fil for at jeg skal kunne rette dem senere.
Avatar billede arne_v Ekspert
29. december 2004 - 12:14 #6
Try catch er mest interessant i forbindelse med at man
vil recovere fra en fejl og lade programmet køre videre.

I det tilfælde skal try catch laves påd et rigtge sted i programmet.
Avatar billede arne_v Ekspert
29. december 2004 - 12:16 #7
Hvis du catcher exceptions i højt oppe (som f.eks. main), så skal du
huske at få stakken ud, så du kan præcis hvor det er gët galt.
Avatar billede funkyloonie Nybegynder
29. december 2004 - 12:23 #8
Umiddelbart smider den fejlen i klassen som den sker i og fanges ikke i main. Hvordan bygger jeg det op?
Avatar billede arne_v Ekspert
29. december 2004 - 12:41 #9
Det forstår jeg ikke.

Følgende virker:

public class NullEx {
    private static void test() {
        String s = null;
        String s2 = s.substring(1);
    }
    public static void main(String[] args) {
        try {
            test();
        } catch (RuntimeException ex) {
            System.out.println("Oops");
        }
    }
}
Avatar billede funkyloonie Nybegynder
29. december 2004 - 13:06 #10
Jeg kan godt se at dit eksempel virker fint. Forskellen er her at det er en bruger-event ved click som udløser fejlen. Jeg paster lige mit lille eksempel så kan evt. se på det.

import java.util.*;

public class Sample {

  static public void main(String[] args) {
    try {
      new Fail();
    }
    catch (Exception  ex) {
      //ex.printStackTrace();
      System.out.println(2);
    }

  }
}

import javax.swing.*;
import java.awt.event.*;

public class Fail extends JFrame{
  public Fail() {
    java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    this.setSize(new java.awt.Dimension(800,600));
    this.setLocation( (screenSize.width-this.getWidth()) / 2, (screenSize.height - this.getHeight()) / 2);
    this.show();

    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    this.addMouseListener(new Fail_this_mouseAdapter(this));
  }

  void this_mouseClicked(MouseEvent e) {
    String u = "e";
    int y = Integer.parseInt(u);
  }

}

class Fail_this_mouseAdapter extends java.awt.event.MouseAdapter {
  Fail adaptee;

  Fail_this_mouseAdapter(Fail adaptee) {
    this.adaptee = adaptee;
  }
  public void mouseClicked(MouseEvent e) {
    adaptee.this_mouseClicked(e);
  }
}
Avatar billede arne_v Ekspert
29. december 2004 - 13:23 #11
Swing er speciel derved at der udover din tråd kører en Swing tråd
i baggrunden.

Fejlen sker i den Swing tråd.
Avatar billede arne_v Ekspert
29. december 2004 - 13:24 #12
Hvis du kigger på stack trace ser du at den starter i:
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
som er Swing tråden.
Avatar billede funkyloonie Nybegynder
29. december 2004 - 13:27 #13
ja. det er vi enige om. jeg ved bare ikke hvordan jeg løser det ;-)
Avatar billede arne_v Ekspert
29. december 2004 - 13:50 #14
99.9% af Swing programmører håndterer exceptions explicit i event handler.

Dem med mod på at lave noget spcielt laver en klasse:

package mypackage;

public class MySwingError {
    public void handle(Throwable t) {
        System.out.println("Oops something bad happended in Swing event");
    }
}

og kalder følgende i main:

System.setProperty("sun.awt.exception.handler",    "mypackage.MySwingError");
Avatar billede arne_v Ekspert
29. december 2004 - 13:53 #15
Men du kan ikke catche en anden tråds exception med en normal try catch.
Avatar billede funkyloonie Nybegynder
29. december 2004 - 14:54 #16
ok. jeg tror holder mig til flertallet.
Avatar billede arne_v Ekspert
29. december 2004 - 19:27 #17
Jeg vil tillade mig at ligge et svar også.
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