为什么要通过基类抛出派生类捕获?

2023-12-05

对于下面的代码,结果是“EA Exception Finished”,这意味着虽然我们向派生类抛出异常,但它被基类捕获。总是这样吗?如果是这样,我怎样才能让派生类捕获,从而出现“EB Exception Finished”?

我也无法完全理解它是什么意思throw EB() and catch(EA&)。并且确实catch(EA&)表示 catch 块获取 EA 的引用object?

抱歉我的无知。如果您向我推荐一本关于异常结构的书或其他参考资料,那将会有很大的帮助。

class EA {};
class EB: public EA {};

void F()
{
  throw EB();  // throw at EB().
}

int main()
{
  try
  {
    F();
  }
  catch(EA&) // caught here??
  {
    std::cout<<"EA Exception";
  }
  catch(EB&) // why not me? every time?
  {
    std::cout<<"EB Exception";
  }

  std::cout<<" Finished"<<std::endl;

  return 0;
}

改变顺序catch块来修复该行为:

#include <iostream>

class EA {};
class EB: public EA {};

void F()
{
  throw EB();  // throw at EB().
}

int main()
{
  try
  {
    F();
  }
  catch(EB&) // why not me? every time?
  {
    std::cout<<"EB Exception";
  }
  catch(EA&) // caught here??
  {
    std::cout<<"EA Exception";
  }

  std::cout<<" Finished"<<std::endl;

  return 0;
}

编译器甚至会警告您:

main.cpp:21:3: warning: exception of type 'EB' will be caught
   catch(EB&) // why not me? every time?
   ^~~~~
main.cpp:17:3: warning:    by earlier handler for 'EA'
   catch(EA&) // caught here??
   ^~~~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要通过基类抛出派生类捕获? 的相关文章

随机推荐

  • 使用 Firebase Simple Login 保护路由

    我正在尝试在使用 Firebase Simple Login 的 Ember 应用程序中实现以下事件序列ember cli 在允许进入任何路由之前检查用户是否经过身份验证 All路由需要经过身份验证 如果用户未通过身份验证 则重定向到Log
  • 使用 Twitter API 版本 1.1 检索 user_timeline 的最简单 Java 示例

    我正在寻找一个使用 Twitter 1 1 API 的简单 Java 示例 但没有找到 使用此处发布的 PHP 示例 使用 Twitter API 版本 1 1 检索 user timeline 的最简单 PHP 示例和其他一些 Stack
  • 根据一列的值合并数据

    我在 R 中有一个数据框 year group sales 1 2000 1 20 2 2001 1 25 3 2002 1 23 4 2003 1 30 5 2001 2 50 6 2002 2 55 我想按组对数据进行分组或创建某种对象
  • 如何使用 html5 重置视频

    我对网络编程有点陌生 我正在尝试弄清楚如何在第一次播放视频后重置视频 我的代码是 var video document getElementById home video video addEventListener click funct
  • 使用 mp3 元数据或 HTML 在 iPhone 锁定屏幕上显示插图和曲目名称

    当您在使用 safari chrome 等后锁定 iPhone 时 当播放 mp3 文件时 它会显示空白的插图和指向 mp3 文件位置的硬链接 看起来相当难看 我可以包含一些替代标签 元数据来显示艺术作品和曲目标题吗 您可以通过设置添加一个
  • 我应该如何处理 APP_KEY 和 APP_SECRET (Dropbox API)

    我使用 Dropbox API 编写了一段简单的代码 这意味着使用我的应用程序的 APP KEY 和 APP SECRET 假设有人也想使用我的应用程序 我创建了一个 github 存储库 推送代码等等 但是 当然 我不放置 APP KEY
  • 将数据从固定长度文件读取到类对象中

    我有一个固定长度的文件 想将其数据读入类对象中 这些对象将进一步用于在数据库中插入 更新数据 虽然可以使用 StreamReader 来完成 但我正在寻找更复杂的解决方案 FileHelper 是另一种解决方案 但我不想在我的程序中使用开源
  • Delphi中'Result'的默认值是多少?

    是否有任何保证的默认值Result函数的变量 如 0 或 nil 或者应该Result使用前总是要初始化吗 我有一个函数返回这样的字符串 function Foo String begin while do Result Result bo
  • 有没有一种简单的方法将MySQL数据转换为标题大小写?

    我有一个 MySQL 表 其中一列中的所有数据均以大写形式输入 但我需要转换为标题大小写 并识别类似于大胆的火球标题案例脚本 I found 这个优秀的解决方案用于将字符串转换为小写 但 Title Case 函数似乎已被排除在我的 MyS
  • 从另一个 ViewController 调用函数

    我有两个 ViewController FirstViewController and SecondViewController 两者都有自己的 Swift 文件 FirstViewController swift and SecondVi
  • android 中的自定义进度对话框?

    我按照以下步骤操作自定义对话框示例在文档中 但我得到了这个例外 有任何想法吗 04 03 18 50 28 787 VERBOSE Bru Press Tab 750 Exception in Tabsjava lang RuntimeEx
  • FSI.exe 在 Ubuntu 10.10 下不起作用

    更新 尝试过 11 月 CTP 版本 同样的错误消息 忘了说这个服务器安装了 Ubuntu 服务器版本 我在运行 Desktop 10 10 的 Ubuntu 桌面上没有遇到此问题 所以我怀疑可能是缺少一些命令行相关的库 安装 librea
  • 动态实例属性

    假设我有一堂课 class Foo object def init self d self d d d a 1 b 2 inst Foo d inst d Out 315 a 1 b 2 有没有办法动态创建 n 个属性 其中每个属性都是一个
  • jQuery 获取 select onChange 的值

    我的印象是我可以通过这样做来获取选择输入的值 this val 并应用onchange参数到选择字段 看起来只有当我引用 ID 时它才有效 我该如何使用这个来做到这一点 尝试这个 select on change function aler
  • 将无聊的事情自动化 - 第 4 章:硬币翻转解决方案

    我正在为 python 编程的 自动化无聊的事情 第 4 章末尾的 硬币翻转 实践项目的解决方案而苦苦挣扎 我有两个解决方案 两者都产生完全不同的结果 第一个显然是错误的 我不确定答案的正确解决方案是什么 解决方案一 import rand
  • C++ 结构成员模板函数的显式专业化 - 这是 Visual Studio 问题吗?

    我对模板专业化有疑问 可以归结为以下代码片段 include
  • IIS 10 应用程序池回收后初始化速度缓慢

    我们的应用程序池在 IIS 10 中的应用程序池回收后初始化时间较慢 回收后大约 5 7 秒 第一个请求后 30 50 毫秒 我做了一些研究 发现 应用程序初始化 模块应该可以解决问题 我将其安装到服务器上 并将应用程序池设置为 Alway
  • 当您无法控制第二次读取 ServletInputStream 的代码时,如何多次读取 ServletInputStream

    我有一个ServletInputStream我需要多次读取 第二次读取的代码位于我无法控制的 API 中 使用时IOUtils copy 看起来仍然只允许读取一次流 流上不允许标记 重置 有任何想法吗 谢谢 创建一个扩展 HttpServl
  • 如何防止 div 在 IE6 中调整大小?

    这是我的标记 现场重现 div style text align center header div
  • 为什么要通过基类抛出派生类捕获?

    对于下面的代码 结果是 EA Exception Finished 这意味着虽然我们向派生类抛出异常 但它被基类捕获 总是这样吗 如果是这样 我怎样才能让派生类捕获 从而出现 EB Exception Finished 我也无法完全理解它是