什么时候应该使用 ThrowHelper 方法而不是直接抛出?

2024-05-07

什么时候适合使用投掷助手方法而不是直接抛出?

void MyMethod() {
    ...
    //throw new ArgumentNullException("paramName");
    ThrowArgumentNullException("paramName");
    ...
}
void ThrowArgumentNullException(string paramName) {
    throw new ArgumentNullException(paramName);
}

我读过,调用投掷助手方法(唯一目的是抛出异常的方法)而不是直接抛出should产生更小的字节码。

这以及明显的封装(另一层间接)可能是不直接抛出的充分理由,至少在某些情况下是如此。

无论如何,在我看来,缺点也并非不严重。

  • 的一部分(异常的) 控制流被隐藏
  • 异常最终会产生更神秘的堆栈跟踪
  • 编译器(2.0)不会识别投掷助手调用是方法的退出点,因此需要一些代码。

我有限的经验是,整体设计通常会变得更糟。

int MyMethod(int i) {
    switch (i) {
        case 1:
            return 1;
        default:
            ThrowMyException();
    }
    return 0; // Unreachable (but needed) code
 }

这可能部分是个人品味的问题。无论如何,您对这个问题的个人指导方针是什么?你觉得使用它是个好主意吗投掷助手对于所有这些常见任务,例如方法参数验证(ThrowArgumentNullException(参数名称)等等)? 我在这个问题上遗漏了一些明显的东西吗?

顺便说一句,我试图不把这个问题与验证问题,例如像这样的方法:

ThrowIfNameIsNullOrEmpty(name);

我的默认方法是直接从异常代码分支抛出。

当我将其包装在一个方法中时,DRY 原则和 3 规则指导:如果我发现自己编写相同的“抛出”代码 3 次或更多次,我会考虑将其包装在一个辅助方法中。

然而,最好编写一个工厂方法来创建所需的异常,然后从原始位置抛出它,而不是抛出异常:

public void DoStuff(string stuff)
{
    // Do something

    throw this.CreateException("Boo hiss!");
}

private MyException CreateException(string message)
{
    return new MyException(message);
}

这保留了堆栈跟踪。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候应该使用 ThrowHelper 方法而不是直接抛出? 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Android 权限 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用

    我正在 React Native 应用程序中工作 我正在努力在 Android 中使用Notification Services BIND NOTIFICATION LISTENER SERVICE 我正在尝试使用读取传入的通知Notifi
  • pgAdmin 服务器未显示[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这里总共有n00b 个问题 我正在使用 pgAdmin 尝试管理远程 PostgreSQL 服务器 我单击连接图标 填写表格 然后单击 确定 该表格消
  • 如果变量的值在编译时已知/未知,则进行专门化

    如何在编译时 在实际编译和运行程序之前 其参数之一的值已知 未知的情况下专门化模板函数 我还不知道怎么办 idea 1 include
  • Pygame - 如何使 hitbox 与敌人的移动一起工作?

    我正在用 Pygame 制作一个 Python 游戏 目前正在研究 hitbox 程序应该暂停 设置play False 每当玩家与敌人碰撞时 只有当我注释掉所有敌人的移动 第 56 64 行 时它才 有效 但这显然不是最好的选择 我读过有
  • 如何在点击事件上调用 Angular 组件 [Angular]

    我不是 Angular 方面的专家 我也遵循了互联网上的一些答案 特别this https stackoverflow com questions 17636528 how do i load an html page in a div u
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • 使用继承的 ES6 React 类时未触发 componentDidMount 方法

    我试图在 React 中使用 ES6 类 并希望所有组件都继承某些方法 但是一旦我尝试扩展扩展 React Component 类的组件 componentDidMount 方法就不会触发 因此什么也不会发生被渲染 我正在使用的代码 基础组
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 不兼容的类型:HomeFragment 无法转换为 Android 中的 Fragment

    我在这部分代码中遇到错误 private void displayView int position update the main content by replacing fragments Fragment fragment null
  • Python:球体的交集

    我对编程非常陌生 但我决定承担一个有趣的项目 因为我最近学会了如何以参数形式表示球体 当三个球体相交时 有两个不同的交点 除非它们仅在一个奇点处重叠 球体的参数表示 我的代码是根据答案修改的Python matplotlib 绘制 3d 立
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • 在 Spark Dataframe 中提取数组索引

    我有一个带有数组类型列的数据框 例如 val df List a Array 1d 2d 3d b Array 4d 5d 6d toDF ID DATA df org apache spark sql DataFrame ID strin
  • 是否可以静默运行 .NET Core 控制台应用程序(隐藏控制台窗口)?

    我正在尝试为自己自动化一些任务 并且编写了一些 NET Core 1 0 控制台应用程序 其中之一是 BrowserRouter 一个简单的应用程序 它基于 URL 模式 决定当我单击 HTTP S 链接时要打开哪个浏览器 浏览器配置文件
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • cmake MSYS Makefiles 生成器丢失

    我通过 pacman 安装了 cmake 3 2 3 当我尝试从 msys64 shell 中使用它时出现错误 cmake G MSYS Makefiles CMake Error Could not create named genera
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 不使用 razor viewengine 进行 Nancy 本地化

    目前我在 Nancy 使用 razor 作为我的视图引擎 我可以在剃刀中像这样访问我的资源文件 Text text greeting 但我想切换到不同的视图引擎 是否有其他支持 TextResource 的视图引擎 在超级简单的视图引擎中本
  • 将“密码”类型添加到 Google Apps 脚本输入框

    是否可以将 密码 类型分配给 Google Apps 脚本输入框 以便不显示文本 以下工作正常 但输入字段是一个简单的文本框 并显示文本而不是 Browser inputBox Please enter your password 我有一个
  • 将现有项目文件夹添加到 eclipse 中的项目资源管理器

    这里可能是一个非常直接的解决方案 但似乎找不到答案 我最近将 Eclipse 工作区更改为我的 dropbox 文件夹 这样我在大学时可以在上网本上工作 在家时可以在桌面上工作 我将所有项目文件夹从旧工作区复制并粘贴到 dropbox 工作
  • 什么时候应该使用 ThrowHelper 方法而不是直接抛出?

    什么时候适合使用投掷助手方法而不是直接抛出 void MyMethod throw new ArgumentNullException paramName ThrowArgumentNullException paramName void