2012-11-28 6 views
9

// Ich habe Code in Catch-Block wriitenWenn eine Ausnahme in Catch-Block selbst auftritt, wie in C# damit umzugehen?

try 
    { 
    } 
    catch(Excepetion ex) 
    { 
    // I have written code Here If Exception Occurs here then how to handle it. 
    } 
+0

Es gibt mehrere richtige Antworten unten, aber ich würde wahrscheinlich das Design meines Codes erneut, um sicherzustellen, als eine Ausnahme nicht ist in einen Fang geworfen oder zumindest auf eine andere Art abstrahiert. Mehrere '' 'probier/catch/finally''' Blöcke ineinander verschachtelt ist ein Code-Geruch - zumindest ist es für mich :). – Jduv

Antwort

1

Ein catch-Block nicht besondere in einer bestimmten Art und Weise ist. Sie müssen entweder einen anderen try/catch-Block verwenden oder den Fehler nicht behandeln.

5
try 
{ 
    // Some code here 
} 
catch (Exception ex) 
{ 
    try 
    { 
     // Some more code 
    } 
    catch (Exception ex) 
    { 
    } 
} 
2

Für die Codezeilen, die eine Ausnahme in catch Block machen zusätzlichen expliziten try..ctach Block werfen könnten. Außerdem in Betracht ziehen, finally Block zu haben, um Linien zu haben, um dort zu laufen. Die gleiche Frage kann für den finally Block auftauchen. Wenn Ihr Code wahrscheinlich eine Ausnahme im Block finally auslöst, können Sie try..catch dort hinzufügen.

try 
{ 
} 
catch (Exception ex) 
{ 
    try 
    { 
     // code that is supposed to throw an exception 
    } 
    catch (Exception ex1) 
    { 
    } 
    // code that is not supposed to throw an exception  
} 
finally 
{ 
    try 
    { 
     // code that is supposed to throw an exception 
    } 
    catch (Exception ex1) 
    { 
    } 
    // code that is not supposed to throw an exception  
} 
8

Sie können einen try catch in den catch-Block setzen, oder Sie können die Ausnahme einfach erneut auslösen. Sein besser finally Block mit Ihrem Versuch zu fangen, so dass selbst wenn eine Ausnahme im catch-Block auftritt, schließlich Blockcode ausgeführt wird.

try 
    { 
    } 
catch(Excepetion ex) 
    { 
    try 
     { 
     } 
    catch 
     { 
     } 
    //or simply throw; 
    } 
finally 
{ 
    // some other mandatory task 
} 

Schließlich Block kann nicht executed in certain exceptions bekommen. Sie können Constrained Execution Regions für einen zuverlässigeren Mechanismus sehen.

+0

Eine verschachtelte Versuch Catch-Anweisung scheint wie schlechtes Design. Wenn das Auslösen einer Ausnahme fehlschlägt, haben Sie größere Bugs zum Frittieren. Schließlich wird es immer so passieren, dass es ein schlechter Platz ist, um Code zu schreiben, der nur passieren sollte, wenn die catch-Anweisung fehlschlägt. Ich würde nur den Griff essen oder in einer idealen Welt ALLE ehandelten Ausnahmen fangen, die Ausnahmen einschließen würden, die während eines Versuch-Fangblocks geworfen werden. –

2

Doppelfehler treten häufig in gut gestalteten 3G-Programmiersprachen auf. Seit dem geschützten Modus und dem 286, ist der allgemeine Entwurf für Hardware-Sprachen, den Chip auf einen Dreifachfehler zurückzusetzen.

Sie sind wahrscheinlich in Ordnung, Ihren Weg aus einem doppelten Fehler zu entwerfen. Fühlen Sie sich nicht schlecht, wenn Sie etwas tun müssen, um die Verarbeitung zu stoppen oder in diesem Fall einen Fehler an den Benutzer zu melden. Wenn Sie in einen Fall geraten, in dem Sie zB eine IO-Ausnahme (Lesen/Schreiben von Daten) abfangen und dann versuchen, den Stream zu schließen, von dem Sie lesen, und der auch fehlschlägt, ist es kein schlechtes Muster, das dramatisch ausfallen und warnen der Benutzer, dass etwas wirklich Außergewöhnliches passiert ist.

+0

Danke an alle .. –

0

Mein Freund Atul .. wenn Sie versuchen, schreiben..Catch in Catch-Block, und wenn wieder eine Ausnahme in inneren Versuch..Catch auftritt, wird das gleiche Problem wieder aufkommen. Also dieses Problem beheben Sie diese Fehler in Anwendungsebene Ereignisse in Global.asax

Prüfung unter Links umgehen kann ..

http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx

http://msdn.microsoft.com/en-us/library/fwzzh56s%28v=vs.80%29.aspx

lassen Sie mich wissen, ob dies für Sie arbeitet. . :)

5

Der beste Weg ist, Ihre eigenen Ausnahmen für verschiedene Anwendungsschichten zu entwickeln und es mit innerer Ausnahme zu werfen. Es wird auf der nächsten Ebene Ihrer Anwendung behandelt. Wenn Sie denken, dass Sie eine neue Exception im catch-Block erhalten können, werfen Sie diese Ausnahme einfach zurück, ohne sie zu behandeln.

Stellen wir uns vor, dass Sie zwei Schichten haben: Business Logic Layer (BLL) und Data Access Layer (DAL) und in einem Catch-Block von DAL haben Sie eine Ausnahme.

DAL:

try 
{ 
} 
catch(Excepetion ex) 
{ 
    // if you don't know how should you handle this exception 
    // you should throw your own exception and include ex like inner exception. 
    throw new MyDALException(ex); 
} 

BLL:

try 
{ 
    // trying to use DAL 
} 
catch(MyDALException ex) 
{ 
    // handling 
} 
catch(Exception ex) 
{ 
    throw new MyBLLException(ex); 
} 
Verwandte Themen