,在C#和C ++中,没有人对new
运算符使用异常处理,原因是什么?
是否保证通话始终会成功?
答案 0 :(得分:9)
是否保证通话始终会成功?
不,这不能保证。
话虽这么说,但总的来说,处理您可以实际执行某些操作的异常是一个好主意。 按惯例,以最小化异常的方式设计对象构造是个好主意。话虽这么说,但这并不总是可行的,而且很多情况下,调用new Foo()
很容易引发你可能想要捕获的异常。
例如,如果您尝试这样做,则可以保证引发异常,因为这比单个维度中数组中允许的最大项目数更长(即使设置了gcAllowVeryLargeObjects
) :
var willCauseException = new double[int.MaxValue];
答案 1 :(得分:4)
嗯,没有人是一个强有力的表达。实际上,工业级应用程序应检查这些错误。但这并不意味着应该到处检查错误。
尝试使用new
创建对象可以引发std::bad_alloc
或OutOfMemoryException
(取决于您的语言),以及构造函数本身可能引发的任何内存。但如果你发现了这个例外,你会用它做什么?正确的做法是在集中的地方捕获这些异常(可能在应用程序的主循环中)并在那里处理它们。每当您看到其中一条消息说“您的内存不足:保存当前的工作并退出应用程序”等,这意味着其中一个例外已被捕获并处理(通常通过发布紧急情况)内存块,允许正常终止,然后警告用户)。
异常管理不包括在任何地方编写try-catch
块;它们必须只存在于正确的位置,其余的代码必须考虑到可能发生异常并且系统状态必须始终处于可恢复状态。