Exception serialisieren?

  • Themenstarter Themenstarter tuxedo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
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:
Code:
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:
Code:
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:

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

		}

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

Code:
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
 
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
 
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
 
Man, das war ja doch einfacher als ich dachte... *hmmpf*

Code:
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)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at de.root1.simon.ProcessMethodInvocationRunnable.processMethodInvocation(ProcessMethodInvocationRunnable.java:125)
at de.root1.simon.ProcessMethodInvocationRunnable.run(ProcessMethodInvocationRunnable.java:57)


at java.lang.Thread.run(Unknown Source)

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

- Alex
 
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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben