4

,在C#和C++中,没有人对运算符使用异常处理new,这是什么原因?是否保证呼叫将始终成功?

4

2 回答 2

9

是否保证呼叫将始终成功?

不,这不能保证。

话虽这么说,一般来说,处理您实际上可以做某事的异常只是一个好主意。 按照惯例,以尽量减少异常的方式设计对象构造是一个好主意。话虽如此,这并不总是可能的,而且在许多情况下,调用new Foo()很容易引发您可能想要捕获的异常。

例如,如果您尝试这样做,您肯定会引发异常,因为这比单维数组中允许的最大项目数长(即使有gcAllowVeryLargeObjects集合):

var willCauseException = new double[int.MaxValue];
于 2013-04-08T15:58:14.330 回答
4

好吧,没有人是一个强烈的表情。事实上,工业级应用程序应该检查这些错误。但这并不意味着应该到处检查错误。

除了构造函数本身可能引发的任何内存之外,尝试创建一个对象new可能会引发一个std::bad_alloc或一个OutOfMemoryException(取决于您的语言)。但是如果你发现了这个异常,你会怎么处理它呢?正确的做法是在一个集中的地方(可能在应用程序的主循环中)捕获这些异常并在那里处理它们。每次您看到其中一条消息说“您的内存不足:保存当前作业并退出应用程序”或类似消息时,这意味着这些异常之一已被捕获并处理(通常通过释放紧急情况内存块以允许优雅终止,然后警告用户)。

异常管理不在于try-catch到处写块;它们必须只存在于正确的位置,并且必须考虑到可能发生异常并且系统状态必须始终处于可恢复状态来编写其余代码。

于 2013-04-08T16:08:23.217 回答