2016-03-28 3 views
0

Можно ли исключить исключение, как было решено в методе Dispose класса Token? Например:Исправить исключение в методе Dispose

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

Что мне нужно, чтобы исключить исключение и продолжить код после.

Не имеет значения, произошло ли исключение. Я знаю, что я могу использовать try/catch, но в этом случае я хотел бы пойти, если это возможно.

Я обнаруживать исключение в побочном:

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

Какой тип исключения? Вы можете просто поймать исключение и ничего не делать с этим. – billybob

+4

«Я знаю, что могу использовать try/catch, но в этом случае я бы хотел поехать, если это возможно. *« Почему? Это похоже на странное требование или желание. Прямым (возможно, только?) Ответом будет «try» с пустым блоком catch. –

+1

Try/catch - стандартный способ обнаружения исключений и решает, обрабатывать их или нет. Какие у вас причины для использования стандартного механизма обработки ошибок? –

ответ

0

Лучший способ сделать это состоит в использовании поймать блок, потому что это то, что он там. Не пытайтесь обучать свои бизнес-требования языку, используйте язык, чтобы писать то, что вам нужно.

Создайте слой абстракции, который обрабатывает ваши требования «не течь исключений». Например:

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(); 
     } 
    } 
} 

После этого достаточно простого использования и осмотра.

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

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

if (guard.ExceptionOccurred) 
{ 
    // React accordingly to this 
} 
Смежные вопросы