Какие исключения могла бы строка = строка выбросить, кроме System.OutOfMemoryException? - PullRequest
7 голосов
/ 26 августа 2010

Код:

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

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

Спасибо

Ответы [ 7 ]

3 голосов
/ 26 августа 2010

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

 try 
 { 
    /// Put Ctor code here!
 } 
 catch (Exception ex) 
 { 
    ExceptionHandler.CatchEx(ex); 
 } 
3 голосов
/ 26 августа 2010

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

  1. основная гарантия

  2. надежная гарантия

  3. гарантия nothrow

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

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

3 голосов
/ 26 августа 2010

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

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

2 голосов
/ 26 августа 2010

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

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

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

2 голосов
/ 26 августа 2010

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

1 голос
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...