Windows 窗体应用程序中异常处理的最佳实践?

2024-07-04

我目前正在编写我的第一个 Windows 窗体应用程序。我现在已经阅读了几本 C# 书籍,因此对 C# 必须处理异常的语言特性有了相对较好的了解。然而,它们都非常理论化,因此我还没有了解如何将基本概念转化为应用程序中良好的异常处理模型。

有人愿意分享关于这个主题的智慧吗?发布您见过像我这样的新手所犯的任何常见错误,以及有关处理异常的任何一般建议,以使我的应用程序更加稳定和健壮。

我目前正在努力解决的主要问题是:

  • 我什么时候应该重新抛出异常?
  • 我应该尝试拥有某种中央错误处理机制吗?
  • 与先发制人地测试磁盘上的文件是否存在等事情相比,处理可能引发的异常是否会对性能产生影响?
  • 所有可执行代码都应该包含在 try-catch-finally 块中吗?
  • 是否有任何时候可以接受空的 catch 块?

非常感谢所有建议!


还有几位...

您绝对应该制定集中的异常处理策略。这可以像包装一样简单Main()在 try/catch 中,快速失败并向用户发送一条优雅的错误消息。这是“最后的手段”异常处理程序。

如果可行的话,先发制人的检查总是正确的,但并不总是完美的。例如,在检查文件是否存在的代码与打开文件的下一行之间,该文件可能已被删除,或者某些其他问题可能会阻碍您的访问。在那个世界里你仍然需要 try/catch/finally 。根据需要使用抢先检查和 try/catch/finally。

永远不要“吞掉”异常,除非在最有据可查的情况下,当您绝对、肯定地确定抛出的异常是可以接受的时。这种情况几乎永远不会发生。 (如果是的话,确保你只吞下specific异常类——不everSystem.Exception.)

构建库(由您的应用程序使用)时,不要吞下异常,也不要害怕让异常冒泡。除非您有一些有用的东西要添加,否则不要重新抛出。永远不要(在 C# 中)这样做:

throw ex;

因为您将擦除调用堆栈。如果必须重新抛出(有时是必要的,例如使用企业库的异常处理块时),请使用以下内容:

throw;

归根结底,正在运行的应用程序抛出的绝大多数异常都应该在某个地方公开。它们不应该暴露给最终用户(因为它们通常包含专有或其他有价值的数据),但通常会被记录下来,并向管理员通知异常情况。可以向用户呈现一个通用对话框,可能带有参考号,以使事情简单。

.NET 中的异常处理与其说是科学,不如说是艺术。每个人都会在这里分享自己的最爱。这些只是我从第一天开始使用 .NET 时所学到的一些技巧,这些技巧曾多次挽救了我的困境。你的旅费可能会改变。

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

Windows 窗体应用程序中异常处理的最佳实践? 的相关文章

随机推荐

  • 使用属性初始化 Angular 2 组件[重复]

    这个问题在这里已经有答案了 有没有办法将参数传递到 Angular 2 组件的根 我已经能够使用属于内部组件模板一部分的组件来执行此操作 但不能使用根组件来执行此操作
  • 比较(密码)属性

    我想使用下面的代码为新用户创建一个视图模型 User 类仅包含我将保留到数据库的两个属性 目前已简化 视图模型添加了一个 比较密码 字段 该字段仅在视图中使用 我更喜欢让视图模型直接使用 User 类 而不是重复 User 中定义的所有字段
  • 像 Twilio 一样按日期对 REST api 进行版本控制有什么好处?

    基本上 我认为对 REST api 进行版本控制是个好主意 这是常识 通常您会遇到两种执行此操作的方法 或者 您的 url 中有一个版本标识符 例如 api v1 foo bar 或者 您使用标头 例如Accept vnd myco v1
  • 您使用哪种 IDE(如果有)构建 python GUI 项目?

    是否有任何 IDE 如 VS 支持拖放来构建 python GUI 连接到数据库等 尽管我是一个 emacs 爱好者 但我发现使用 VS 创建 GUI 更容易 仅对于 GUI 我发现 VisualWx http visualwx alter
  • 启动应用程序时反应本机 Android 错误

    V SoLoader libimagepipeline so not found on data data com learnapp lib main D SoLoader libimagepipeline so found on data
  • 如何转义 XML 中的 & 符号,以便它们在 HTML 中呈现为实体?

    我有一些 XML 文本希望在 HTML 页面中呈现 该文本包含一个 符号 我想在其实体表示中呈现它 amp 如何在源 XML 中转义这个 符号 我试过 amp 但这被解码为实际的 符号 即在 HTML 中无效 https stackover
  • 街景中标记上的 InfoWindows

    根据 Google 文档 当您在地图上创建标记时 市场也会 复制 到地图的街景版本上 但是 onClick 事件绑定不会被复制 或者至少看起来不会被复制 因此我无法在 StreetView 中打开标记上的 InfoWindow 理想情况下
  • 图像选择器在 React Native 应用程序中不起作用,为什么?

    我已经成功安装了react native image picker 对于一个新的react本机应用程序 链接它并通过info plist文件授予正确的权限来访问相机 照片等 我正在使用 React native image picker 页
  • 在实际应用或执行之前验证 yaml 中定义的 OpenShift 对象

    我在 template yaml 文件中有一个 OpenShift 模板 其中包括以下对象 部署配置 pod 服务和路由 我使用以下命令来执行 yaml oc process f template yml oc apply f 我想在实际应
  • 将 WebView 保存为 PDF 返回空白图像?

    我正在尝试弄清楚如何将 WebView 保存到 PDF 并且完全卡住了 真的很感激一些帮助吗 我在 OSX 上的 Cocoa 和 Swift 中执行此操作 这是到目前为止我的代码 import Cocoa import WebKit cla
  • 如何根据对象属性字符串过滤“ngFor”循环内的项目

    我需要过滤里面的项目ngFor循环 通过更改下拉列表中的类别 因此 当从列表中选择特定类别时 它应该只列出包含该相同类别的项目 HTML 模板
  • java中的长轮询

    我已经编写了用于长轮询的服务器端代码 我想用java写客户端程序 因此 根据长轮询 客户端发送一个由服务器帮助的请求 当事件发生时服务器响应该请求 然后客户端发送新的请求 所以我面临的麻烦是用java编写的客户端 发送请求后 如何继续检查客
  • JavaScript 开发人员不使用 Array.push() 是否有原因?

    我经常看到开发人员在 JavaScript 中使用如下所示的表达式 arr arr arr length Something arr arr length Another thing 不会push更合适吗 arr arr push Some
  • 通过 powershell 将调试器附加到多个进程

    我有几个正在运行的进程 我想通过 powershell 将它们附加到 VS 调试器 目前 我可以这样做 Get Process NServiceBus Host Debug Process 如果只有一个进程 系统会提示我选择正确的调试器 然
  • 谷歌模拟 - 我可以在同一个模拟对象上多次调用 EXPECT_CALL 吗?

    如果我打电话EXPECT CALL在同一个模拟对象上两次TEST F 会发生什么 期望是否附加到模拟对象中 或者第二次调用是否消除了第一次调用的效果 I found 后子句 https github com google googletes
  • 滚动后 ListView 未显示正确的值

    在我的应用程序中我使用的是CustomListView与ArrayAdapter显示不同国家的时间 但在 6 到 7 行之后 取决于手机屏幕尺寸 时间值会重复 根据之前的一些文章 我编写了以下代码片段来获得解决方案 但问题仍然存在 以下是我
  • 如何等待进程及其所有子进程退出?

    是否有一个等待方法 当目标进程及其所有子进程退出时会返回 看来 Process WaitForExit 只会等待目标进程 net 中有一个错误会给出您所追求的行为 WaitForExit 如果您异步读取输出 将等待所有子进程 p Start
  • vue js 2:访问已安装函数中的道具

    我的子组件中有数据道具 在已安装函数的子组件内部 我需要从 props 获取特定值并设置选择下拉值 我正在使用 vue multiselect 插件 工作正常 这是代码 module exports props Subscriptions
  • python easy_install:指定存放所需文件的目录

    我正在尝试使用 easy install 来安装 MySQL python 它几乎立即失败 mysql c 36 23 错误 my config h 没有这样的文件或目录 mysql c 38 19 错误 mysql h 没有这样的文件或目
  • Windows 窗体应用程序中异常处理的最佳实践?

    我目前正在编写我的第一个 Windows 窗体应用程序 我现在已经阅读了几本 C 书籍 因此对 C 必须处理异常的语言特性有了相对较好的了解 然而 它们都非常理论化 因此我还没有了解如何将基本概念转化为应用程序中良好的异常处理模型 有人愿意