# Error String von Konsole auslesen?



## Angiii (29. Juli 2009)

Hallo,

ich nutze die RXTX-Bibliothek zur Ansteuerung eines Geräts über USB mit Hilfe eines FTDI-Wandler. RXTX hat die Eigenschaft, eine IOException zu werfen, wenn das USB-Kabel ausgesteckt wird. Hier ein Auszug aus der Konsole:


```
Error 0x5 at /home/bob/foo/rxtx-devel/build/../src/termios.c(482): Zugriff verweigert
Error 0x5 at /home/bob/foo/rxtx-devel/build/../src/termios.c(2714): Zugriff verweigert
Error 0x5 at /home/bob/foo/rxtx-devel/build/../src/termios.c(482): Zugriff verweigert
```

Da ich nicht direkt auf den RXTX-Sourcecode zugreifen kann, will ich nun die Ausgabe auf der Console überwachen. Wenn dann die obigen Fehlermeldungen erscheinen, will ich entsprechend reagieren können. Soweit die Theorie. 

Leider klappts mit dem Auslesen noch nicht so ganz. Das ganze reagiert einfach nicht. Meine Idee war jetzt, dass es sich beim Fehlerstring um eine "Error"-Message handelt, in meinem Code setze ich aber auf einem normalen Input-String auf. Wie kann ich aber den Errorstring auslesen? Oder denke ich einfach zu kompliziert?
Hier mein Code: 


```
/*
     * Erzeugt Fehlermeldung wenn USB-Kabel abgesteckt wird
     * und leitet disconnect ein.
     */
    public class ConnectorControl implements Runnable {
    	public void run() {
    		while (!Thread.currentThread().isInterrupted()) {  
        	
    			if (readln().contains("Error 0x5")){
    				System.exit(0);
    			}
    	}
    }


public static String readln()
    {
            try
            {
                    // initiate input-reader
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(System.in) );
   
                    // read input
                    String s = in.readLine();
           
                    // return input
                    return s;
            }
           
            catch( IOException e )
            {
                    System.out.println( e.getMessage() );
            }
      
            return "No Input.";
    }
```

Danke!


----------



## zeja (29. Juli 2009)

Bekommst du denn kein Event in dem Fall?

Die Konsole auslesen scheint mir da nicht der richtige Weg.... Wie auch immer, wenn dann müßtest du System.err bzw. System.out auslesen.


----------



## Angiii (30. Juli 2009)

Mit Event abfragen siehts leider eher schlecht aus. Ist ein Bug in der RXTX-Library. 

Zur besseren Veranschaulichung: Ich habe genau das selbe Problem, das hier im letzten Beitrag beschrieben wird: http://www.tutorials.de/forum/java/314895-serielle-schnittstelle-probleme-bei-datenauswertung.html

Meine Idee war nun eben, den Fehler über die Console zu überwachen. Natürlich keine ideale Lösung.

Das auslesen von System.err habe ich schon versucht. Nur mit

```
BufferedReader in = new BufferedReader(
                            new InputStreamReader(System.err) );
```
hat es nicht funktioniert, da System.err ein Ausgabeformat ist. Gibts nicht sowas wie einen "Outputstreamreader"? Habe leider nichts gefunden.


----------



## zeja (30. Juli 2009)

Von einem OutputStream kann man nicht lesen.

Du kannst aber eine Klasse schreiben die PrintWriter erweitert und den original System.err kapselt. Die setzt du dann als neuen System.err. In den überschriebenen Methoden bekommst du dann alles mit und kannst es z.B. in einer Liste merken die du dann abrufen kannst.


----------



## Thomas Darimont (30. Juli 2009)

Hallo,

an deiner Stelle würde ich mir den RXTX  Source Code anschauen und nach einer Möglichkeit suchen auf dieses Ereignis reagieren zu können.

Kannst du vielleicht regelmäßig einen ErrorState an der Connection / Port abfragen?

aber trotzdem...
schau mal hier:

```
package de.tutorials;

import java.io.PrintStream;

public class SysErrInterception {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.setErr(new PrintStream(System.err){
            public void print(String s) {
                System.out.println("Intercepted: "+ s);
                super.print(s);
            }
        });
        
        
        System.err.println("Foo");
    }

}
```

Gruß Tom


----------



## Angiii (30. Juli 2009)

Wie schon gesagt, den RXTX-Source Code habe ich nicht, nur die Class-Dateien. Woher die Exception kommt kann ich somit nicht nachvollziehen bzw. beeinflussen. Das Auslesen der Console ist momentan meine einzige Idee.

@Darimont: Cool, in die Funktion "System.seterr" kann ich direkt Sachen wie meine Disconnect-funktion und ein Fehlerpopup mit hineinschmuggeln. Dadurch kann ich auf das Abstecken des USB-Steckers schonmal reagieren. Nachteil: Reagiert im Moment auch auf andere Fehlermeldungen und wird beim abstecken 5x auf einmal aufgerufen

@zeja: Klingt zuverlässig, muss ich mir mal ansehen.

Danke euch zwei. Hab ich zumindest schonmal was zum arbeiten. Vielleicht fällt mir ja doch noch eine Alternative zum Consolenauslesen ein.


----------

