初学者关于try catch(runtime_error RunTimeError)的有关问题

菜鸟求教:关于try catch(runtime_error RunTimeError)的问题
楼主最近心血来潮,立志要成为一名伟大的程序猿,于是从最熟悉的C++入手,在学习到异常处理的时候,遇到了这样一种情况:系统win7,MsVC++6.0企业版。例子代码基本上是照着教程来的,主要的函数如下:
float Accumulate(const char theOperator,const float theOperand) //计算过程
{
static float Result=1; 
switch (theOperator)
{
case '+':Result += theOperand;break;//加
case '-':Result -= theOperand;break;//减
case '*':Result *= theOperand;break;//乘
case '/':Result /= theOperand;break;//除

default:throw runtime_error ("Error oprator, Try it again.");  //抛出运算符异常。
}
return Result;
}
1、int main(int argu,char *argv[])
2、{
3、 cin.exceptions(cin.failbit);  //抛出输入异常
4、
5、 int ReturnCode=0;  //主函数返回值
6、
7、 do
8、   {
9、 try
10、 {
11、 char Operator=GetOperator();  //输入运算符
12、 float Operand=GetOperand();  //输入计算值
13、 cout<<"Result:"<<Accumulate(Operator,Operand)<<endl; 输出运算结果
14、 }
15、
16、 catch(runtime_error RunTimeError)  //处理runtime_error异常
17、 {
18、 ReturnCode=SAMSErrorHandling::HandleRunTimeError(RunTimeError);
19、 }
20、
21、 catch(...) //处理其他异常
22、 {
23、 ReturnCode=SAMSErrorHandling::HandleNotANumberError();
24、 }
25、
26、 }
27、 while(SAMSPrompt::UserWantsToContinueYOrN("More Accumulates?"));
28、
29、 return ReturnCode;
30、}

   问题来了:按照设计本来catch(runtime_error)是处理输入运算符错误,而catch(...)则是处理主函数12行输入数值类型错误的,但是实际运行的时候,11、12行两个输入的异常都被catch(runtime_error)捕获了。这是为什么???楼主百思不得其解,求助度娘和MSDN查询throw try catch 和runtime_error,也抓不住核心。资料云:catch可以有多个,每个定义不同的类型,每当出现异常的时候,就根据定义的类型来catch,其他没定义的交给catch(...)处理;我的困惑1:难道这个输入流异常也属于runtime_error?困惑2:根据这个http://www.cplusplus.com/reference/stdexcept/runtime_error/?kw=runtime_error
runtime_error exception包含range_error,overflow_error,underflow_error,system_error;12行输入类型错误又是属于哪一种?




------解决思路----------------------
明白了。应该用catch(ios_base::failure f)来捕获异常。
class failure : public runtime_error {
public:
     explicit failure(
          const string& _Message)
     };
此类因为继承于runtime_error,所以如果没有针对特定类型,则会被runtime_error捕获异常
另:在人机交互接口中使用异常来代替错误判断,不是好的设计方法。异常不用于处理人机交互出错的情况