2016-05-18 3 views
1

У меня есть вопрос относительно того, как именно эта вещь работает.ExceptionHandler в C# WebAPI

public class GlobalExceptionHandler: ExceptionHandler 
{ 
    private string _pvtMsg; 

    public override void handle(ExceptionHandlerContext context) 
    { 
     //few if else conditions 
     if() 
     { 
     } 
     else if 
     { 
      _pvtMsg = "some value"; 
     } 
     context.Result="Some random value depending upon if else execution"; 
    } 
} 

Теперь, когда _pvtMsg устанавливается после того, всякий раз, когда происходит исключение всегда имеет то же самое значение, как и раньше.

ли, когда я установил _pvtMsg = "a"; в состоянии else if, в следующий раз, когда возникает ошибка _pvtMsg еще значение "a"?

Есть ли только один экземпляр handler, доступный на протяжении всего срока службы моего приложения, и, следовательно, это происходит? Или есть другие причины? Любые документы для справки будут оценены.

Btw: этот обработчик зарегистрирован с использованием метода RegisterWebApiConfig.

config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler()); 

ответ

3

Ваше предположение верно. Поскольку вы регистрируете Экземпляр из GlobalExceptionHandler (с ключевым словом new) _pvrMsg всегда будет иметь значение предыдущего (успешного) вызова.

Если _pvrMsg имеет решающее значение для все, что вы планируете делать в вашем if блоке, я бы рекомендовал эту блокировку часть кода, чтобы убедиться, что handle не выполняет несколько раз одновременно.

Самый простой способ сделать это было бы:

public class GlobalExceptionHandler: ExceptionHandler 
{ 
    private string _pvtMsg; 
    private readonly object _lock = new object(); 

    public override void handle(ExceptionHandlerContext context) 
    { 
     lock(_lock) 
     { 
      //few if else conditions 
      if() 
      { 
      } 
      else if 
      { 
       _pvtMsg = "some value"; 
      } 
      context.Result="Some random value depending upon if else execution"; 
     } 
    } 
} 
+0

Есть ли другой способ иметь новое значение для _pvtMsg для каждого исключения? Один из способов - сбросить значение в методе Handle. но кроме этого есть какой-то способ? – Mandy

+0

Код немного * пуст *, поэтому я понятия не имею, что вы запланировали для '_pvtMsg'. –

+0

В _pvtMsg, я добавляю какое-то пользовательское сообщение в особых случаях исключения. это оно. – Mandy

Смежные вопросы