- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 c++ 中的 gcc 编写程序。十二月。第五,由于一个奇怪的问题(https://stackoverflow.com/a/8392854/837803),我发布了一个问题。当软件异常导致函数声明时没有像这样的“抛出”规范:
int foo();
或者这个:
int foo() throw();
gcc 生成的代码会崩溃。
我想告诉 gcc,任何类型的软件异常都可能会留下我编写的任何函数。我认为它类似于:
int foo() throw(...);
但是:我不想在所有函数规范中都写 throw(...) 。我意识到我的程序大小会更大,但这对这种情况来说不是问题。另外,我读到我建议的 gcc 行为是违反 ANSI 的。但这也没有问题。
在gcc的许许多多许许多多的命令行选项中,一定有一个是我要找的,但我还没有找到。
我正在寻找的选项是什么?
最佳答案
我不同意这一点:
gcc-generated code will crash.
这完全是错误。
这样声明的函数:
void func1();
如果你抛出一个异常,它会导致堆栈展开到一个适当的捕获。如果没有合适的 catch 程序退出(在这种情况下堆栈展开是实现定义的(因此将 catch all 放在 main 中))。
这样声明的函数:
void func2() throw(); // ie no throw.
如果异常从该函数中逃逸,则调用 unexpected()。 unexpected 的默认操作是调用 abort() 导致程序退出(注意:您可以用用户定义的函数替换 unexpected 但它必须退出或抛出一个可以通过 throw 规范的替代异常(在这种情况下那是不可能的))。
您想要的行为是默认行为(没有抛出规范)。 throw 规范是一项失败的实验,因此已被弃用。无论如何你都不应该使用它们(除了不抛出)。
因此,如果您这样定义函数,您可以获得正常工作的代码,但有异常:
void func3(); // Exceptions work fine.
但是最好在main()中放一个catch
int main()
{
try
{
// DoWork
}
catch(std::exception const& e) // We can print a good error message with these
{
log(e.what());
throw; // Not much you can do so re-throw for the OS.
}
catch(...) // Catch all other exceptions.
{
log("Unknown Exception");
throw; // Not much you can do so re-throw for the OS.
}
// Catching forces the stack to unwind all the way to main()
// Otherwise it is implementation defined whether it unwinds.
}
关于c++ - gcc 指定任何软件异常的命令行选项可能会保留使用 'throw()' 声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8412222/
我一直认为“throw”和“throw ex”的区别was that throw alone wasn't resetting the stacktrace of the exception. 不幸的
我需要处理这样的api错误代码,并为某些状态代码抛出错误。但是遵循代码显示了以上错误。我怎样才能做到这一点? func login(data: [String: Any], completion: @
我见过在 JavaScript 中抛出错误的 3 种不同方式: throw 'message'; throw Error('message'); throw new Error('message');
这个问题在这里已经有了答案: Exception handling : throw, throws and Throwable (8 个答案) 关闭 10 年前。 谁能简单介绍一下Java异常处理中
这是我的代码: func loadData() { ref.child(currentUserID!).observe(.childAdded) { (snapshot) in
可能很明显,但是我仍然无法理解throw和rethrow之间的区别,什么时候应该使用它们中的任何一个? 最佳答案 根据Effective Dart: If you decide to rethrow
这个问题在这里已经有了答案: "new" keyword in Scala (3 个答案) 关闭 5 年前。 在 Scala 中进行一些函数式编程,并且来自 Java 背景,我倾向于像这样抛出异常:
我有一个验证输入字符串的代码,如果输入字符串与所需的格式不匹配,我需要抛出 IllegalArgumentException,有多个字段,每个字段都有一组不同的验证条件,因此对于当前我正在执行的每个字
我的方法有一个抛出 NullPointerException 的返回类型。 public class Student { public String studentOne() {
有些帖子询问这两者之间的区别。 (为什么我要提这个...) 但我的问题在某种程度上有所不同,我在另一个错误神级处理方法中调用了“throw ex”。 public class Program {
谁能解释一下 throw、throws 和 Throwable 之间的区别以及何时使用哪个? 最佳答案 throws :在编写方法时使用,声明有问题的方法抛出了指定的(检查的)异常。 与检查的异常相反
我想知道编写异常收件箱和发件箱是否会改变特定程序的行为,例如 抛出 MyException(); 和 抛出(我的异常()); 我的代码: #include #include using names
抛出异常时,保留堆栈跟踪是最常见的期望行为,在 Java 中,这可以通过 throw ex; 获得,但在 C# 中,throw; 必须使用。 (另请注意,许多 C# 程序员经常错误地使用 throw
这个问题在这里已经有了答案: Exception handling : throw, throws and Throwable (8 个答案) 关闭 8 年前。 谁能举个例子说清楚Java异常处理中
这两个有什么区别吗? 最佳答案 异常是针对程序逻辑中的错误。 JVM 使用错误来表示环境有问题,例如 OutOfMemoryError 或 IncompatibleClassChangeError。
我试图到处寻找这个问题的答案,但似乎我运气不好。 我有一个非常简单的 Mongoose 模型 var userObject = { profile: { username: {
我遇到了这个重新抛出的异常,我很惊讶它甚至可以编译。 } catch(SomeException e) { ... throw(e); } 这个throw()和平时用的有什么区别吗?.
想象两段相似的代码: try { [...] } catch (myErr &err) { err.append("More info added to error..."); throw
我试图弄清楚Java中方法签名中的抛出和抛出语句之间的区别。方法签名中的抛出如下: public void aMethod() throws IOException{ FileReader f
这个问题在这里已经有了答案: throw Error('msg') vs throw new Error('msg') (2 个回答) 24 天前关闭。 没有 new 时抛出错误有什么缺点吗?关键词?
我是一名优秀的程序员,十分优秀!