2013-04-16 6 views
31

Wenn ich einen return innerhalb des Blocks eines finally Anweisung platzieren, sagt der Compiler mir:Warum kann Kontrolle nicht eine endgültige Aussage hinterlassen?

try 
{ 
} 
catch 
{ 
} 
finally 
{ 
    return; 
} 

:

Kontrolle nicht den Körper eines finally

Beispiel verlassen können Warum ist das?

+0

Zeigen Sie Ihren Code bitte – duDE

+5

@duDE Code wurde kaum benötigt, aber trotzdem hinzugefügt. –

+1

Vielen Dank dafür! ;) – duDE

Antwort

52

Überlegen Sie, was passieren würde, wenn Sie return 1 innerhalb des try Block und return 0 innerhalb des finally Block waren ... Ihre Funktion würde versuchen, zwei Werte zurück! Die kombinierten Optionen try und catch sind in Bezug auf den Steuerungsfluss erschöpfend.

+3

das ist ein gutes Beispiel, +1 – ken2k

17

Es ist von Design und es ist in C# Spezifikation beschrieben: 8.10 The try statement.

Es ist ein Fehler bei der Kompilierung für ein break, continue oder goto Anweisung Übertragungssteuerung aus einem finally Block. Wenn ein break, continue oder goto Anweisung in einem Block finally auftritt, muss das Ziel der Anweisung innerhalb des gleichen finally Block sein, oder sonst eine Kompilierung- Fehler auftritt.

Es ist ein Fehler bei der Kompilierung für eine return Anweisung tritt in einem finally Block.

+0

Der Link ist nützlich - danke! –

-2

Aktuelle Antworten erklären, warum dies auch der Fall ist, aber ich denke auch wichtig zu beachten, es ist, wie einfach es diese Einschränkung in dem Fall zu umgehen ist, wo kein Rückgabewert beteiligt ist, und die finally Klausel ist das letzte, was bei dem Verfahren (was oft der Fall ist):

try {} 
catch {} 
finally 
{ 
    FinallyMethod(); 
} 

Dann in FinallyMethod können Sie return Aussagen so viel verwenden, wie Sie

möchten
void FinallyMethod() 
{ 
    //... 
    if (x == y) 
     return; 
    else 
     a = b; 
    //etc. 
} 
+0

Rückkehr innerhalb 'FinallyMethod' wird nichts für die Methode tun, die das try/catch/finally enthält. – Stijn

+0

Nur weil Sie von 'FinallyMethod' zurückkommen, werden Sie nicht von der aufrufenden Site zurückkehren. –

+0

Natürlich kann es aber für den Kontrollfluss nützlich sein, z.B. 'if (! x) zurückgeben; // mache eine Menge Sachen. Sie können also 'return' in' FinallyMethod' zu diesem Zweck verwenden, anstatt alles unter geschachtelten 'if' Klauseln zu tun. –

Verwandte Themen