image.png
当编写一个函数时,你通常可以预测潜在的问题(如文件不存在或错误的输入类型)。 与用户交流这些问题,是条件(conditions)的工作: 错误、 警告和消息

  • 严重错误(Fatal error)由stop()发起,并强制终止所有执行的程序。 当一个函数没有办法继续运行时,要使用错误(Error)
  • 警告(Warning)是由 warning()产生的,用于显示潜在的问题,比如当某些向量化的输入元素无效的时候,如log(-1:2)
  • 消息message()产生,是一种提供信息输出的方法,用户可以很容易地忽略掉它们(suppressMessages())。 我经常使用信息来让用户知道,对于一些缺失的重要参数,函数自动选择了什么值

    不要使用print() cat()输出异常,因为无法捕获

条件处理工具(Condition handling tools),比如 withCallingHandlers()tryCatch()try(),允许你在条件发生时采取特定的动作
防御性编程:如何在常见的错误发生之前避免它们, 本原则是快速失败(**fail fast**),一旦出现问题就要发起错误。 在 R 中,这通过三种特定模式来实现: 检查输入的正确性, 避免非标准计算,以及避免函数可以返回不同类型的输出

调试技术

一般步骤

一般来说有四个步骤,当然print()大法也不是不行

  1. 程序报错
  2. 复现错误

    二分查找(binary search)在这个过程中特别有用。 要进行二分查找,你将反复删除一半的代码,直到你定位到了错误代码段。 这个过程是很快的,因为,每进行一步,你需要查看的代码数量都会减少一半

  3. 找出错误代码

  4. 修改并测试

    调试工具

    RStudio目前有三种主要的调试工具:
  • RStudio 的错误检查器以及能列出导致错误的函数调用序列的 traceback()
  • RStudio 的”以调试方式重新运行”(“Rerun with Debug“)以及 options(error =browser),可以在错误发生的地方,打开一个交互式会话
  • RStudio 的断点(break point)以及能在代码的任意位置打开一个交互式会话的browser()函数

    确定调用顺序

    。。。未完