# Exception serialisieren?



## tuxedo (17. Jan 2008)

Hi,

ich bastle mal wieder weiter an meinem SIMON (meine RMI Alternative)... Bin gerade dabei das Exception-Handling einzubauen. 

Am Server führe ich ja "remote" eine Methode aus. 

Client:

```
Object result = endpoint.sendInvocationToRemote(remoteObject, method.getName(), method.getParameterTypes(),args);
```

Diese kann aber beim Server eine Exception auslösen. Abfangen kann ich die Exception schon:

Server:

```
try {
			result = method.invoke(o, args);
			} catch (InvocationTargetException e){
				result = e.getTargetException();
			}
```

"result" enthält dann genau die geworfene Exception. Ich serialisiere also "result" und schicke es durch den Socket zurück zum Client. Dort lese ich also die "Anwort" des Methodenaufrufs aus (siehe erster Codeabschnitt des Clients) und gebe diese dem Methodenaufrufer zurück.

Hier muss ich jetzt aber schauen, ob tatsächlich ein Ergebnis zurück kommt, oder ob's eine Exception ist:


```
if (result instanceof Throwable){
			
			System.out.println(result);

		}
```

Wenn ich in der entfernten Methode (beim Server also) also ein


```
throw new IllegalArgumentException("SIMON Muhahaha");
```

mache, dann bekomme ich mit der obigen "instanceof" Abfrage in der Console die Ausgabe:



> java.lang.IllegalArgumentException: SIMON Muhahaha



Soweit so gut. Ich hab jetzt aber das Problem dass ich die Exception nicht ausgeben will, sondern sie soll quasi "nochmal" als Exception auftauchen, diesmal halt beim Client. Und der Stacktrace sollte wenn möglich irgendwie sagen WO die Exception beim Server geflogen ist.

RMI macht das auch irgendwie (bin noch nicht ganz dahinter gestiegen). Kann man eine so abgefangene Exception an einer anderen Stelle ein zweites mal "werfen" ohne den STacktrace "komplett" zu verfälschen?

- Alex


----------



## lhein (17. Jan 2008)

Ich würde dafür eine eigene Exception Klasse machen ala SIMONRemoteException und dieser dann eine Exception übergeben. Intern kannst Du ja dann Stacktrace usw. speichern.
Beim Client wirfst du diese Exception dann und printest den stacktrace aus, der deiner exception übergeben wurde.

lr


----------



## tuxedo (17. Jan 2008)

Hmm, daran hab ich auch schon gedacht. Aber "cooler" wäre es, wenn's so gehen würde. 

Hab gerade nochmal mit RMI verglichen:

Da krieg ich zwar keine "gekapselte" Exception, dafür geht aber der Stacktrace verloren (sieht aus als ob die Exception Msg rausgelesen wurde, sowie der "Typ", und die Exception einfach nochmal geworfen wird. Dadurch ist halt der Stacktrace futsch.

- Alex


----------



## tuxedo (17. Jan 2008)

Man, das war ja doch einfacher als ich dachte... *hmmpf*


```
if (result instanceof Throwable){
			
			throw (Throwable)result;

		}
```



> java.lang.IllegalArgumentException: SIMON Muhahaha
> at de.root1.simon.test.benchmark_simon.SimonServerBenchmarkInterfaceImpl.benchmark(SimonServerBenchmarkInterfaceImpl.java:17)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> ...



Stacktrace bleibt (weitgehend) erhalten (ich sehe also WO der Fehler im Servercode liegt), und ich brauch absolut nix kapseln... *cool*

- Alex


----------



## maki (17. Jan 2008)

> instanceof Throwable


Ist das nicht der Fall für alle Exceptions und sogar Errors?


----------



## tuxedo (17. Jan 2008)

Genau (alle Exceptions erben früher oder später von Throwable). Um genau das geht's mir doch... Wenn in der Remote-Methode _irgendeine_ Exception ausgelöst wird, dann fang ich die ab, serialisiere sie, und werfe sie beim Client nochmal.


----------

