C++中throw并非一定要在try块中才有效,该怎么处理

C++中throw并非一定要在try块中才有效
不是说被检测部分必须被放到try块中才起作用么?  下面这段程序

#include<iostream>

using namespace std;



int main()
{
void f1();
try
{f1();}
catch(double)
{cout<<"error1"<<endl;}
cout<<"endmain"<<endl;
return 0;
}

void f1()
{
void f2();
try
{
f2();
}
catch(int)
{
cout<<"error2"<<endl;
}
cout<<"endf1"<<endl;
}

void f2()
{
void f3();
try
{
   f3();
}
catch(char)
{
cout<<"error3"<<endl;
}
cout<<"endf2"<<endl;
}

void f3()
{
double a=0,b=1.2;
class SS
{
public:
SS()
{
cout<<"now construct"<<endl;
}
~SS()
{
cout<<"now destruct"<<endl;
}
private:
int aa;
};
         SS s;
 throw a;
try
{
a=0;

}

catch(float)
{ cout<<"error3"<<endl;
}
cout<<"endf2"<<endl;
}


运行结果是C++中throw并非一定要在try块中才有效,该怎么处理

这说明throw发出的信息还是被catch了啊!有点迷惑

------解决方案--------------------
异常传播,会穿透函数,直接传播,函数是不能限制异常传播的。
如果一个函数,调用另一个函数,
被调函数 放在 try块内部调用则catch 块可以捕获,被调函数抛出的异常,

只要被调函数抛出的异常,有对应的catch 块可以接收,并且此前没有被捕获
而对被调函数的调用,是可以到达的。

即:和try块匹配的,任何一个catch块 ,catch 的异常类型和抛出的异常兼容
比如 catch 的异常类型如下
1)被抛出异常类型指针,
2)被抛出类型引用,
2)被抛出类型对象,
4)被抛出异常基类,
即可捕获异常。