Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Enterprise Java > globales Exceptionhandling
Antwort
 
Themen-Optionen
Alt 07.11.2005, 15:19   Nach oben    #1
Siron
Neuer Benutzer
 
Registriert seit: 15.07.2005
Beiträge: 6
Standard globales Exceptionhandling

Hi,

ich hab da mal ein kleines Problem. Ich würde gerne in einer Tomcatanwendung nicht behandelte Exceptions loggen. In C# gibt es die Möglichkeit einen eigenen Handler anzumelden, der dann ( so soll es in meinem Fall sein ) die Exceptions in einer Datenbank loggt. Für Java habe ich folgendes Snippet gefunden:

Code:
public static void main(String[] args) {
// Tell AWT to invoke my Handler.
  System.setProperty("sun.awt.exception.handler", "ErrorHandler");
  [...]
}

[...]
 
class ErrorHandler extends java.lang.Object {

/**
* Default constructor must exist (I know it's the default; this is here in
* case somebody adds any other constructor).
*/
public ErrorHandler() {
System.out.println("CONSTRUCTED");
}

public void handle(Throwable t) {
System.err.println("Hey, I caught it!");
System.err.println(t.toString());
}
}
Das ist so ziemlich das was ich brauche NUR klappt das nur bei awt-threads. Angeblich ( so steht es im Kommentar eines anderes examples ) soll es ab java 1.5 einen solchen mechanismus für alle threads geben. Hat sich schon jemand damit beschäftigt?

MfG

Siron
Siron ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.11.2005, 18:42   Nach oben    #2
Murray
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Neu mit Java 5 ist
Code:
java.lang.Thread.setUncaughtExceptionHandler( java.lang.Thread.UncaughtExceptioHandler ec);
Damit kann man also für einen Thread einen eigenen Handler setzen. In einer Multi-Thread-Application muss man das allerdings auch für jeden einzelnen Thread tun.
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.11.2005, 18:45   Nach oben    #3
Murray
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Ergänzung: es gibt in java.lang.Thread auch noch eine statische Methode (setDefaultUncaughtExceptionHandler), mit der man das nur einmal für alle Threads machen muss (zumindest theoretisch; ausprobiert habe ich das noch nicht).
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.11.2005, 21:31   Nach oben    #4
Siron
Neuer Benutzer
 
Registriert seit: 15.07.2005
Beiträge: 6
Standard

Hey danke,

es funktioniert. Ich hab mal ein kleines Beispiel geschrieben. Da kann man auch sehen, dass wenn man die statische Methode benutzt, für alle der gleiche Handler gilt.

Code:
public class ExceptionHandlingTest {
	
	public ExceptionHandlingTest() {
		MyThread threadA, threadB;
		
		// hier wird der Handler für alle Threads gesetzt
		Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
		
		// Thread starten
		threadA = new MyThread();
		threadB = new MyThread();
		
		threadA.start();
		threadB.start();
	}
	
	// auf gehts
	public static void main(String[] args) {
		new ExceptionHandlingTest();
	}
	
	// Thread der die unbehandelte Exception wirft
	private class MyThread extends Thread{
		public void run(){
			int count = 0;
			int[] area = { 1,2,3,4,5,6,7,8,9,10 };
			
			while ( true )
				System.out.println ( area[count++] );
		}
	}
	
	// mein Handler
	private class MyExceptionHandler implements UncaughtExceptionHandler{
		
		// wird ausgelöst wenn eine nicht behandelte Exception auftritt
		public void uncaughtException( Thread thrd, Throwable excp){
			JOptionPane.showMessageDialog( new JFrame(),
				    exceptionToString ( excp ),
					"Fehler",
				    JOptionPane.ERROR_MESSAGE );
		}
		
		// der Infoblock der angezeigt wird
		private String exceptionToString( Throwable t ){
			StackTraceElement[] trace;
			String message;
			
			message = "Exception: " + t.getClass().getName() + EOL;
			message += "Info: " + t.getMessage() + EOL;
			message += "Trace: ";
			
			trace = t.getStackTrace();
			for ( int i = 0; i < trace.length; i++ ){
			    message += trace[i].getClassName() + "." +
					 trace[i].getMethodName() + ":" +
					 trace[i].getLineNumber() + EOL;
			}
			
			return message;
		}
		
		private final String EOL = "\r\n";
	}
	
}
Siron ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:17 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44