繁体   English   中英

在C ++中,是否可以强制用户捕获异常?

[英]In C++, Is it possible to force the user to catch exceptions?

简而言之,是否有可能让C ++强制一个方法的调用者放一个try ... catch块?

(澄清一下:我并不一定意味着直接调用者,我的意思是强迫它被捕获到某个地方。而且,我正在谈论在编译时强制执行。)

长:

我已经读过,不建议使用异常规范,并且无论如何它都无法正常工作( http://4thmouse.com/mystuff/articles/UsingExceptionsEffectively.html

但普遍的共识似乎倾向于使用异常来返回写入返回错误代码的方法的用户的错误。

所以,如果我正在写一个库,那么什么是阻止用户调用我的方法而不放任何try ... catch块,然后当我的代码抛出异常时让他的程序崩溃?

(要明确的是,我只需要在用户堆栈中的某处捕获异常,不一定在立即调用代码中,并且如果不是这样, 编译器会抱怨。)

不它不是。

实际上,没有任何机制可以强制函数的调用者(调用堆栈中的任何地方)处理任何类型的错误。 至少,不是通过编译失败。 可以丢弃返回值。 即使使用返回值捆绑错误代码(通过expected<T, E> ),如果用户在获取之前没有实际检查该值是否可用,则不会发出编译时错误。

C ++ 17可能会给我们[[nodiscard]]属性,如果调用者丢弃了返回值(可能是错误代码),它允许编译器发出警告。 但编译时警告将尽可能接近。

简而言之,是否有可能让C ++强制一个方法的调用者放一个try ... catch块?

不会。这会破坏例外的整个目的。 特别针对在多个层中传播错误而没有中间层知道它们的用例进行了例外处理。

假设您有一个调用层次结构,如A - > B - > C - > D - > E,并且在E中发生错误.A可以处理错误。 B,C和D 根本不需要知道错误。 这正是异常有利的!

如果要将错误直接返回给调用者,因为处理错误确实是调用者的关注点,那么异常通常是错误的设计,返回值可能是更好的选择。


在Java中已尝试过“强制”某种形式的异常,但我认为这是一个失败的实验,因为它通常会产生如下代码:

try {
    method();
} catch (SomeCheckedException ex) {
    // ignore
}

C ++不鼓励这应该被视为一个功能


我已经读过,不建议使用异常规范,但无论如何它都无法正常工作

究竟。 有用且唯一有效的唯一异常规范是throw() ,表示根本没有抛出任何异常,并且一个已被C ++ 11中的noexcept取代。

但普遍的共识似乎倾向于使用异常来返回写入返回错误代码的方法的用户的错误。

往上看。 这取决于您是希望传播错误还是调用者能够并且应该处理它。

所以,如果我正在写一个库,那么什么是阻止用户调用我的方法而不放任何try ... catch块,然后当我的代码抛出异常时让他的程序崩溃?

要求用户使用try块包围所有函数调用的库具有错误的接口,因此应该重新设计。

另外......你假设一个“程序”将使用你的库。 但这种假设并不总是正确的。 库客户端本身可以是库。 程序和库之间可能有很多不同的库层。 如果您不关心哪个图层处理它们,则使用例外。

有一个普遍的共识吗? 不是我知道的。 至于例外,没有。 编译器无法强制某人在调用堆栈的某处捕获异常。 在编译时,编译器不知道谁可能正在调用您的函数,并且您的函数可能抛出任何异常,就像函数调用的任何函数一样。 链接器可能有机会,但它必须维护大量额外信息,以处理函数可能抛出的异常,以及函数可能捕获的异常。 当你开始谈论动态加载的库(DLL / .so)时,这会变得更加丑陋,因为它必须在运行时得到解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM