2013-06-06 6 views
1

У меня есть следующий код:Изменить улов (COMException в.п.), чтобы поймать (COMException)

 try 
     { 
      retval = axNTLXRemote.IsUnitPresent(_servers[0].IPAddress, 1, _servers[0].RemotePort, _servers[0].CommFailDelay * 1000); 
     } 
     catch (COMException ce) 
     { 
      throw ce; 
     } 

Который дает мне предупреждение followig, который я хочу, чтобы избавиться от:

CA2200: Microsoft. Использование: «Connect()» перерисовывает пойманное исключение и явно указывает его как аргумент. Вместо этого используйте «throw» без аргумента, чтобы сохранить местоположение стека, где первоначально было создано исключение.

Я прочитал следующее The difference between try/catch/throw and try/catch(e)/throw e, и я понимаю, что «throw ce; сбросит трассировку стека и заставит ее выглядеть так, как если бы исключение было выбрано из этой функции.

Я хочу просто изменить его на «бросок» вместо «throw ce», который избавится от предупреждения.

  1. Какая разница в следующих уловов:

    catch (COMException ce) 
        { 
         throw; 
        } 
    

    и

    catch (COMException) 
        { 
         throw; 
        } 
    
  2. ли мне нужно только иметь «COMException се», если я хочу, чтобы каким-то образом использовать се переменная?

  3. Кроме того, когда я выполняю 'throw' или 'throw ce', это вызывающая функция, которая будет обрабатывать или поймать ее ?? Я немного не понимаю.

+0

Хороший совет. Лучше совет, чтобы просто избавиться от try/catch, он ничего не полезен. –

+0

Не обязательно верно. Возможно, он хочет выбросить исключения COMException, но по-разному относиться к другим исключениям. Трудно сказать, не видя всего его кода. –

+0

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

ответ

1

Там нет никакой разницы в обоих случаях, но только тогда, когда переменная исключения должны быть использованы для стека/сообщения и т.д.

Так:

catch(ComException); 

и

catch(ComException ex); 

операторы будут создавать аналогичные MSIL, за исключением локальной переменной для объекта ComException:

.locals init ([0] class [mscorlib]System.Exception ex) 
1

Я уверен, что кто-то будет прыгать с убером-технического ответом, но в моем опыте ответ на ваш первый два вопрос в том, что нет никакой разницы, и, как вы заявили, вы включаете только ce если вы намеревались использовать его для записи трассировки стека в журнал или отображения сообщения пользователю или тому подобное.

throw отправит исключение в цепочку. Это может быть метод вызова или, если ваш метод имеет несколько вложенных блоков try/catch, он отправит исключение в следующий блок try/catch, в который вложен текущий блок try/catch.

Вот несколько хороших ресурсов, чтобы проверить, если вы хотите в дальнейшем прочитать по теме:

+0

Итак, если я смотрю дальше по цепочке (или для другого вложенного catch) и не вижу ничего другого, использующего переменную ce, то я знаю, что могу безопасно удалить ее ???? –

+0

Если в текущем блоке catch, использующем 'ce', ничего нет, вы можете удалить имя. Далее по стеку вы можете найти другой блок catch, который определяет имя для исключения, а затем обрабатывает его каким-то образом. –

1
  1. Единственное отличие состоит в том, что с catch (COMException ce), вы назначаете исключение переменной, тем самым позволяя вам получить доступ к ней в блоке catch. Помимо этого, он во всех отношениях идентичен.
  2. Я не уверен, что вопрос здесь. Если вы хотите получить доступ к объекту исключения, вы должны указать ему имя переменной в предложении catch.
  3. Независимо от того, как и где генерируется исключение, исключение будет проходить через стек вызовов до ближайшего блока catch, который соответствует.

Вот пример.

void Method1() 
{ 
    try 
    { 
     Method2(); 
    } 
    catch // this will catch *any* exception 
    { 
    } 
} 

void Method2() 
{ 
    try 
    { 
     Method3(); 
    } 
    catch (COMException ex) // this will catch only COMExceptions and exceptions that derive from COMException 
    { 
    } 
} 

void Method3() 
{ 
    // if this code were here, it would be caught in Method2 
    throw new COMException(); 


    // if this code were here, it would be caught in Method1 
    throw new ApplicationException(); 
}