除了System.OutOfMemoryException之外,string = string throw可能会引发哪些异常?

7

代码:

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

我认为编写这段代码的人只是“小心谨慎”,但出于好奇,像这样进行字符串赋值的行可能会抛出什么异常?我能想到的是System.OutOfMemoryException,还有其他的吗?

谢谢


2
mConnection_String有一个可能会抛出异常的setter吗?(我知道mConnection_String的命名约定并没有表明这种情况) - Brandon
2
也许 'try' 'catch' 是原始代码的剩余部分(也许它试图测试连接)。 - Nissim
我猜这里甚至都不能出现OutOfMemoryException。成员变量已经被分配,赋值只是将引用写入该变量。 - Albin Sunnanbo
2
无论可能引发什么异常,这都是您绝不想捕获的异常。因为它将是一个非常恶劣的异常。这只会带来麻烦,请删除try/catch。 - Hans Passant
7个回答

3

我无法看出这会产生任何异常。我想程序员只是使用了一个构造函数模板:

 try 
 { 
    /// Put Ctor code here!
 } 
 catch (Exception ex) 
 { 
    ExceptionHandler.CatchEx(ex); 
 } 

3

在我看来,这里不会发生任何事情。如果您使用类似于Subversion的工具,则可能会发现有人删除了一些代码,但未删除异常处理。否则就只是愚蠢。

您可以毫不犹豫地删除冗长的代码。


3

Herb Sutter 写了几篇关于异常安全的好文章,在其中的 一篇文章 中,他展示了3种异常安全类型:

  1. 基本保证

  2. 强保证

  3. nothrow保证

这些原则在C++世界中是常见的,但我们也可以在.NET世界中使用它们,因为它们中的一个适用于您的情况。

如果mConnection_String是System.String类型(或其他引用类型)的字段,那么您肯定知道,这段代码是“nothrow保证”,因为简单赋值引用类型根本不会抛出异常。


2
一个 OutOfMemoryException 在这里不太可能发生,因为字符串没有被复制,也没有需要分配新内存的情况。

2

我想不出任何问题,甚至没有内存溢出异常。字符串存储在字符串池中。如果你的程序中有两个相同的字符串,它们都引用字符串池中的同一个字符串实例。

另请参阅String.Intern()的文档。

编辑:如评论所指出的那样,字符串池在这里是无关紧要的,因为这只是一个引用赋值(但一些信息仍然有用,尽管与问题无关,对此表示抱歉)。赋值后,两个变量将指向内存中的完全相同的对象,不会声明新的内存。


不,这仅适用于字符串字面量,即代码中的常量字符串表达式或显式内部化的字符串。 string s1 =“Hello”string s2 =“Hell”+'o' 实际上是不同的字符串对象,并且 object.ReferenceEquals(s1,s2) 将返回false,即使两个字符串相等。 - Dirk Vollmar
2
字符串池在这里是无关紧要的。它只是一个引用副本。之后,mConnection_String和vConnection_String指向同一个对象。如果更改vConnection_String,则会分配新的内存... - James Curran

1

...ThreadAbortException?(但它会在catch块后再次抛出。)


不是所有的情况都是如此的:我们无法确定 ExceptionHandler 是否会重置线程中止!(是的,这有点牵强。) - Paul Ruane

0

抛出的异常取决于 mConnection_String 是什么。

如果 mConnection_String 是一个字段,那么很不可能抛出任何异常。Try..Catch 逻辑可能只是标准样板代码,以便在稍后添加代码时,它位于 try...catch 块中。

如果 mConnection_String 是一个属性,那么它可以抛出在 set 属性中抛出(且未被捕获)的任何异常。您需要查看 set 属性以了解可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接