Exceptions wie in Java

MD1978

Erfahrenes Mitglied
Hallo,
ich kenne folgendes von Java: Wenn man dort eine Methode mit throws Exception deklariert, muss die Exception bei Aufruf dieser Method aufgefangen werden.
Warum ist das in C# anders?
Wie gebe ich bei einer Methode an, was für Exceptions sie werfen kann?

Gruss,

MD
 
den Thread habe ich schon gelesen.
Wo steht dort, wie man festlegt, dasss eine Exception aufgefangen werden muss?

MD
 
Das ist in C#, wie auch in Visual Basic nicht nötig/möglich. Entweder CLR order Compiler übernehmen das für dich. Du musst dich nur ums Exception Handling kümmern.
Du kannst über die XML-Dokumentation angeben, ob die Methode Exceptions werfen kann, aber es gibt keine Möglichkeit ein Handling zu "erzwingen". Wird eine Exception in der nächsthöheren Funktion nicht behandelt, wird sie weitergereicht, bis sie schliesslich die CLR erreicht und diese sich daran macht, den Fehler anzuzeigen und das Programm ev. zu beenden.
 
Code:
try{
	// Stell Dir vor Du hast harausgefunden das Irgendwas NULL ist.
	throw new ArgumentNullException("m_Obj"); // null Refenz

	// Stell Dir vor Du hast harausgefunden das irgend ein Array zu kurz ist.
	throw new IndexOutOfRangeException("m_ObjAry"); //

}
catch ( ArgumentNullException ex ){
	// Hier kannst Du entscheiden was Du jetzt für eine Exception weiterreichst
	// Bsp.:
	throw new ArgumentException(string .Format("Der Parameter {0} darf nicht NULL sein!",ex.ParamName));
}
catch ( InedOutOfRangeException ex ){
	// Stell Dir vor an dieser Stelle das Programm geschlossen werden sollte.
	// Bsp.:
	throw new ApplicationException(string .Format("Der Parameter {0} darf nicht weniger als 5. Stallen haben!",ex.Message));
}
catch ( Exception ){
	// Hier passiert was Unvorhergesehenes
}
finally{
	
}
In der Übergeordneten Instanz kannst Du natülich auch das alles wieder abfangen
und Beispielsweise Meldungen an den User ausgeben.

MfG cosmo
 
Zuletzt bearbeitet:
cosmochaosmaker hat gesagt.:
In der Übergeordneten Instanz kannst Du natülich auch das alles wieder abfangen
und Beispielsweise Meldungen an den User ausgeben.

MfG cosmo

Das ist bekannt aber die Frage geht um "checked exceptions"
siehe:
Wo steht dort, wie man festlegt, dasss eine Exception aufgefangen werden muss?

Und dort gibt es keine Entsprechung unter C#
 
Du weisst das ich ne NULL in Java bin. :)

:offtopic:
Was würde das für einen Nutzen bringen? Würde es nicht weitere Exceptions mit sich nachziehen?

Kannst mir das jamand Erklären?

MfG cosmo
 
Zuletzt bearbeitet:
cosmochaosmaker hat gesagt.:
Du weisst das ich ne NULL in Java bin. :)
Kannst Du mir das Erklären?
Was würde das für einen Nutzen bringen?

Checked Exception zwingen den Benutzer einer Biblothek sich darum zu kümmern
wie er mit Ausnahmen umgeht.

Beispiel ein Datenbank Klasse, welche natürlich SQLException werfen kann, wenn z.b
der SQL Server nicht erreichbar ist.
Definiere ich das diese Methode eine SQLException wirft dann muss sich jeder der meine
Klasse nutzt Gedanken machen wie er mit diesem Umstand umgeht.

Bei einer Datenbank Klasse ist es zwar vom Namen her ersichtlich das hier Datenbank Operationen durchgeführt werden.
Deshalb nehmen wir mal ein etwas abstrakeres Beispiel.
Eine Klasse eines CMS das einen Links herausgibt.

Innerhalb dieser Klasse wird auch rekursiev ein Verzeichniss durchsucht um vorhandene Dateien zu behandeln.
Das hier eine Fileoperation durchgeführt wird ist durch die Klassenbezeichnung MenuOut nicht erkennbar. Die Methode getMenus() aber wirft eine IOException, weshalb der Programmierer gezwungen wird daran zu denken das hier Dinge schief gehen können.

Habe ich eine Methode die eine bestimmte Exception zwar werfen könnte aber dies meist recht unwahrscheinlich ist und nur in Ausnahmefälle auftritt dann leite ich meine Exception von RuntimeException ab, und sie kann auch abgefangen werden, muss es aber nicht.

Sprich es ist eine Designentscheidung, um was für eine Exception es sich handelt, und wie und ob sie behandelt werden muss.

cosmochaosmaker hat gesagt.:
Würde es nicht weitere Exceptions mit sich nachziehen?

Nein wieso sollte es?
Du muss keine Exception weiter nach oben reichen. Du kannst genau das selbe wie mit einer unchecked Exception machen (wie Java-RuntimeException oder eben C#) sie ignorieren.
Nur musst du dies bei checked Exception explizit machen.

try { Menu[] menus = MenuOut.getMenues() } catch(IOException e) { // mir egal }
 
Dadurch kannst Du sichergehen, dass Nutzer einer Methode sich mit dem Exception dieser Methode befassen. Die Exception kann dann immer noch weiter geworfen werden, aber das steht dann explizit im Code.


MD
 

Neue Beiträge

Zurück