2016-03-28 6 views
0

Ist es möglich, eine Ausnahme in Dispose-Methode der Tokenklasse als gelöst zu markieren? Zum Beispiel:Ausnahme lösen in Dispose-Methode

//code before 
using(var e = new Token()){ 
    //.. 
    throw new Exception(); 
    //.. 
} 
//code after 

Was ich brauche, ist die Ausnahme zu stornieren und weiter mit dem Code nach.

Es spielt keine Rolle, ob eine Ausnahme aufgetreten ist. Ich weiß, dass ich versuchen/fangen kann, aber in diesem Fall würde ich gerne gehen, wenn es möglich ist.

Ich Erkennung Ausnahme in der von:

bool isExceptionOccurred = Marshal.GetExceptionPointers() != IntPtr.Zero || Marshal.GetExceptionCode() != 0; 
+0

Was ist der Typ der Ausnahme? Sie könnten einfach die Ausnahme abfangen und nichts damit machen. – billybob

+4

"* Ich weiß, dass ich versuchen/fangen kann, aber in diesem Fall würde ich gerne gehen, wenn es möglich ist. *" - Warum? Das scheint eine seltsame Anforderung oder ein seltsames Verlangen zu sein. Die einfache (vielleicht nur?) Antwort wäre ein "Versuch" mit einem leeren "Fang" -Block. –

+1

Try/catch ist der standardmäßige Weg, um Ausnahmen zu erkennen und zu entscheiden, ob sie behandelt werden sollen oder nicht. Welche Gründe haben Sie, den Standardmechanismus zur Fehlerbehandlung nicht zu verwenden? –

Antwort

0

Der beste Weg, das zu tun, ist ein catch-Block zu verwenden, weil das ist, was es ist da. Versuchen Sie nicht, Ihre Geschäftsanforderungen in die Sprache zu bringen, verwenden Sie die Sprache, um zu schreiben, was Sie brauchen.

Erstellen Sie eine Abstraktionsschicht, die die Anforderung "Ausnahmen nicht auslaufen lassen" behandelt. Zum Beispiel:

public sealed class ExceptionGuard<T>:IDisposable where T:IDisposable 
{ 
    private readonly T instance; 

    public bool ExceptionOccurred { get; private set; } 

    public ExceptionGuard(T instance) { this.instance = instance; } 

    public void Use(Action<T> useInstance) 
    { 
     try 
     { 
      useInstance(instance); 
     } 
     catch(Exception ex) 
     { 
      this.ExceptionOccurred = true; 
      // Hopefully do something with your exception 
     }   
    } 

    public void Dispose() 
    { 
     Dispose(true); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      this.instance.Dispose(); 
     } 
    } 
} 

Danach ist es eine ziemlich einfache Sache zu konsumieren und zu inspizieren.

var guard = new ExceptionGuard(new Token()); 

using (guard) 
{ 
    guard.Use(token => /* Do something with your token */);   
} 

if (guard.ExceptionOccurred) 
{ 
    // React accordingly to this 
} 
Verwandte Themen