博客
关于我
(转)考虑错误情况
阅读量:790 次
发布时间:2023-01-23

本文共 1254 字,大约阅读时间需要 4 分钟。

考虑错误情况处理

错误处理的真正含义

错误处理是编程中的一大挑战。很多人对“错误处理”有误解,他们认为它仅限于应对一些特殊情况,比如内存分配失败或函数调用异常。然而,实际上,错误处理是程序的核心 competitiveness,它涉及如何预见系统可能面临的各种异常,并确保程序在这些情况下依然可以稳定地运行。

在构建一个需要高可用性的应用程序时,您需要考虑到系统可能遇到的各种异常。无论是内存耗尽、文件未找到、网络连接中断,还是预期中的成功操作出错,程序都必须有一个完整的错误处理机制来应对这些情况。

此外,错误处理不仅仅是应对失败,还包括如何处理成功的情况。很多人容易忽视这一点,但成功路径同样需要处理,因为它们也可能因系统环境的变化而出现问题。


多个API约定的问题

在编程中,可能会混用不同的API约定,这将导致各种问题。例如:

  • 返回值的不一致性

    Windows API中有些函数返回BOOL值,而COM函数返回HRESULT。这种不一致可能导致 programmer混淆。例如,FAILED(Status)宏会错误地将0解释为失败。

  • 错误信息的不明确性

    有些API不会提供详细的错误信息,只返回错误码。程序员需要通过GetLastError或类似的函数来获取更多信息。

  • 内存分配的问题

    无论是使用HeapAlloc还是malloc都需要检查返回的NULL指针是否有效。检查这一步是程序稳定性的基础。


  • 正确处理错误的两个关键原则

  • 总是检查返回状态

    program在临IFS的任何地方都必须检查返回值。例如,GetWindowsDirectory返回0表示失败,而ReadFile失败后缓冲区可能包含未初始化的值。

  • 总是检查内存分配

    无论是使用哪种内存分配函数,都需要确保存在返回的指针。例如,malloc返回NULL表示失败,而new可能在内存耗尽时引发异常。


  • 常见错误示例

  • 不检查函数返回值

    例如:

    TCHAR cDriveLetter;_getWindowsDirectory(szWindowsDir, MAX_PATH);if (buffer[0] == 0) { // WRONG!!! }

    如果GetWindowsDirectory失败,szWindowsDir可能是一个未初始化的空字符串,导致cDriveLetter为负值。

  • 错误处理的做法

    应采取以下措施:

    • 定义清晰的错误处理约定,确保程序员知道如何应对不同类型的错误。
    • 使用宏或函数来简化错误处理。例如,FAILED(hr)宏会检查HRESULT是否为负值。
    • 在内存分配失败时,删除新分配的指针以防止内存泄漏。

  • 小结

    错误处理是程序可靠性的核心。编写高质量代码的程序员必须从一开始就预见各种可能的错误,并设计相应的处理机制。以下几点是成功的关键原则:

    • 定义清晰的错误处理约定。
    • always check返回状态和内存分配。
    • 避免混用不同的API约定。

    只有在错误处理方面下足功夫,才能确保程序在各种异常情况下都能稳定运行。

    转载地址:http://zteyk.baihongyu.com/

    你可能感兴趣的文章
    06-使用dockerfile构建nginx、redis镜像
    查看>>
    07-docker系列-使用dockerfile构建python、jenkins镜像
    查看>>
    07-使用dockerfile构建python、jenkins镜像
    查看>>
    08-docker系列-docker网络你了解多少(上)
    查看>>
    09-docker系列-docker网络你了解多少(下)
    查看>>
    1 解决XP重装后原文件夹拒绝访问
    查看>>
    10-docker系列-docker文件共享和特权模式
    查看>>
    #AMBA##AHB总线学习
    查看>>
    #C++# 关于 #ifdef __cplusplus extern “C“ { #endif
    查看>>
    #C2#S2.1# 一个简单的UVM验证平台
    查看>>
    #C2#S2.2~S2.3# 加入 factory/objection/virtual interface 机制
    查看>>
    #C8# UVM中的factory机制 #S8.1.1# OOP 语言三大特性 systemverilog的支持
    查看>>
    #C8# UVM中的factory机制 #S8.1.2# 到底重载?多态?
    查看>>
    #C8# UVM中的factory机制 #S8.1.3# UVM实战代码再剖析
    查看>>
    #C8# UVM中的factory机制 #S8.1.4# 约束的重载
    查看>>
    #C8# UVM中的factory机制 #S8.2.1# factory 机制重载法则
    查看>>
    #systemverilog# 之 event region 和 timeslot 仿真调度(三)概念
    查看>>
    #C8# UVM中的factory机制 #S8.2.2# 复杂重载方式
    查看>>
    #C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形
    查看>>
    #C8# UVM中的factory机制 #S8.4.1# factory机制的实现
    查看>>