我在很多地方都使用过 if...else
语句,但是我对异常处理还是陌生的。这两者的主要区别是什么?
例如:
int *ptr = new (nothrow) int[1000];
if (ptr == NULL) {
// Handle error cases here...
}
或
try
{
int* myarray= new int[1000];
}
catch (exception& e)
{
cout << "Standard exception: " << e.what() << endl;
}
所以我们在这里使用标准异常类,它有一些构建函数,如 e.what()
。所以这可能是优势。除此之外,我们还可以使用 if...else
处理所有其他功能。使用异常处理还有其他优点吗?
收集评论在回答中所说的内容:
自1998年标准化以来,new
失败时不返回空指针而是抛出异常,即std::bad_alloc
。这与 C 的 malloc
不同,可能与 C++ 的一些早期准标准实现不同,其中 new
可能 也返回了 NULL(我不不知道,说实话)。
在 C++ 中有可能在分配失败时获取空指针而不是异常:
int *ptr = new(std::nothrow) int[1000];
简而言之,您拥有的第一段代码不会按预期工作,因为它是在存在 C++ 异常的情况下尝试进行 C 风格的错误处理。如果分配失败,将抛出异常,永远不会进入 if block ,并且程序可能会终止,因为您没有捕获 bad_alloc
。
有很多文章将一般错误处理与异常与返回码进行比较,如果想在这里涵盖这个主题,那就太过分了。异常(exception)的原因包括
- 函数返回类型不被错误处理占用,但可以返回实际值——不需要“输出”函数参数。
- 您不需要处理每个函数中每个函数调用的返回,而是可以在调用堆栈的某些级别捕获异常,您实际上可以处理错误
- 与一个全局
errno
变量和一个返回的错误代码相比,异常可以将任意信息传递到错误处理站点。