Какие исключения могут вызывать string = string помимо System.OutOfMemoryException?

Код:

  public Constructor(string vConnection_String)
  {
     try
     {
        mConnection_String = vConnection_String;
     }
     catch (Exception ex)
     {
        ExceptionHandler.CatchEx(ex);
     }
  }

Я думаю, что человек, который это запрограммировал, был "просто осторожен", но из интереса, какие исключения могут быть выброшены в строку, которая здесь есть строковое присваивание? Я могу вспомнить System.OutOfMemoryException, но какие другие?

Спасибо

7
задан AndrewJacksonZA 26 August 2010 в 14:13
поделиться

7 ответов

Херб Саттер написал несколько отличных статей о безопасности исключений, и в одной из них он показывает 3 типа безопасности исключений:

  1. базовая гарантия

  2. сильная гарантия

  3. гарантия nothrow

Эти принципы широко известны в мире C++, но мы могли бы использовать их и в мире .net, потому что один из них имеет место в вашей ситуации.

Если mConnection_String является полем типа System.String (или другого ссылочного типа), то вы точно знаете, что этот код является «гарантией отсутствия возврата», потому что простое присвоение для ссылочного типа вообще не мог генерировать исключения.

3
ответ дан 6 December 2019 в 15:16
поделиться

С моей точки зрения, здесь ничего не может произойти. Если вы используете что-то вроде subversion, вы, вероятно, увидите, что кто-то удалил здесь некоторый код, не удаляя обработку исключений. Иначе это просто глупо.

Вы можете удалить многословный код без каких-либо сомнений.

3
ответ дан 6 December 2019 в 15:16
поделиться

An OutOfMemoryException вряд ли произойдет здесь, потому что строка не скопирована и не нужно выделять новую память.

2
ответ дан 6 December 2019 в 15:16
поделиться

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

 try 
 { 
    /// Put Ctor code here!
 } 
 catch (Exception ex) 
 { 
    ExceptionHandler.CatchEx(ex); 
 } 
3
ответ дан 6 December 2019 в 15:16
поделиться

Ничего, что я могу придумать. Даже не исключение нехватки памяти. Строки хранятся в пуле строк. Если в вашей программе есть одна и та же строка дважды, они оба ссылаются на один и тот же экземпляр строки в пуле строк.

См. также документацию для String.Intern().

РЕДАКТИРОВАТЬ : Как указано в комментарии, пул строк здесь не имеет значения, поскольку это просто ссылочное назначение (но тем не менее некоторая информация о нем полезна, хотя она не имеет ничего общего с вопросом, извините за тот). Обе переменные будут указывать на один и тот же объект в памяти после присваивания, и новая память не будет востребована.

2
ответ дан 6 December 2019 в 15:16
поделиться

Вызванные исключения будут зависеть от того, что такое mConnection_String.

Если mConnection_String является полем, маловероятно, что возникнут исключения. Логика Try..Catch, вероятно, просто существует как стандартный шаблонный код, поэтому, когда код добавляется позже, он находится в блоке try...catch.

Если mConnection_String является свойством, то оно может генерировать любое исключение, которое может быть генерировано (и не перехвачено) в заданном свойстве. Вам нужно будет заглянуть в свойство set, чтобы увидеть, что возможно.

0
ответ дан 6 December 2019 в 15:16
поделиться

...ThreadAbortException? (Но он будет выброшен снова после блока catch.)

1
ответ дан 6 December 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: