C++ c++;-是否需要在try块之后立即写入catch块?

C++ c++;-是否需要在try块之后立即写入catch块?,c++,c++11,error-handling,exception-handling,try-catch,C++,C++11,Error Handling,Exception Handling,Try Catch,我的编译器为以下代码提供了一个错误: #include <iostream> #include <stdexcept> using namespace std; void test() { throw runtime_error("Error"); } int main() { try { test(); } for (int i = 0; i < 10; i++) {

我的编译器为以下代码提供了一个错误:

#include <iostream>
#include <stdexcept>

using namespace std;


void test()
{
     throw runtime_error("Error");
}

int main()
{
     try
     {
          test();
     }

     for (int i = 0; i < 10; i++)
     {

     }

     catch (exception& e)
     {
          cout << e.what();
     }
}
#包括
#包括
使用名称空间std;
无效测试()
{
抛出运行时_错误(“错误”);
}
int main()
{
尝试
{
test();
}
对于(int i=0;i<10;i++)
{
}
捕获(例外和e)
{

是的,的确如此。是的,我的意思是确实如此


明确地说,一些人似乎被上述简短的回答弄糊涂了:

一个catch块确实需要在try块之后立即写入

还有第二个问题:

我认为如果在try块中抛出错误,程序将冒泡出来,直到找到合适的catch块。为什么这里不适用


因为您只能在try块之后立即编写catch块。其他任何内容都是格式错误的程序。

它应该始终与以下伪代码类似:


是的。问题结束。是的,
try
catch
不是独立的结构。它们构成一个复合词expression@NathanOliver老实说,很难说。这是基本的语言特性。函数是否总是必须指定返回类型(或void)“
new
关键字是否总是这样拼写,或者您是否也可以拼写它”
knowed
?我觉得这样的问题没有什么价值。@InertialIgnorance不是一项辅导服务。这样的问题会在任何时候得到回答。您是否尝试阅读过任何内容?@InertialIgnorance您可以问任何您想问的问题,您刚刚问了。您可以n甚至得到了答案,你也得到了。但是像你这样的问题一般不会给网站增加价值,因为它们不太可能对其他人有多大帮助。这就是为什么简单的教科书问题经常被人皱眉的原因。那么,你是指是吗?@SergeyA是的,或多或少,远远多于少于,因为少于30,多于3030岁,30岁是我能做的最起码的事。@Inertialignor答案是肯定的。解释是肯定意味着它(catch block)确实(需要在try block之后立即写入)。所以“是的,是的”这是对你问题的完整回答。你文章的其余部分基于一个错误的假设,即你可以在其他地方写它。因为你不能,所以没有“应该发生什么”可能还有另一种语言,即catch块不必与尝试块相邻,但这不是C++,它的行为不是我有资格谈论的。@我不明白这个问题。我是说,我可以对它吹毛求疵,给出意见等,但是基于意见的问题是不成立的。如果你问为什么langauge构造是这样的,那是时间造成的(可能是90年代之前!)你必须看看比较语言设计,看看是否有任何语言处理catch块不同,哪些是C++之前存在的,而不是。避免在这里发表意见是困难的,而且必须是一席精心制作的特定问题来讨论它。具有严格模式的ts:
if-else
(else部分是可选的)“代码> > do,代码< >切换情况下默认为,而代码>尝试catch < /C> >代码> catch /<代码>代码结构在这方面不是唯一的。这是什么编程语言?@ USER(SergeyA),您通常也不会在C++中用值捕获异常。@它是伪代码来说明点,通过引用/ VAL。UE在这方面真的很重要吗?@ Sergya为什么你需要通过C++中的引用来捕获异常?@ Galaxy如果值被传递,你正在创建新的对象。如果,异常是由内存不足引起的,那么你的异常处理程序中会有另一个异常,这是不可捕捉的。
try {
    risky code block
}
catch (ExceptionClassName exceptionObjectName) {
    code to resolve problem
}