【问题标题】:Do I need to handle any error cases in my code below?我需要在下面的代码中处理任何错误情况吗?
【发布时间】:2017-12-06 07:56:42
【问题描述】:

我的代码如下写入文件。我需要担心任何错误情况吗? 我需要处理以下错误情况吗?

1.i/o操作逻辑错误,

2.i/o操作读写错误,

3.异常安全。

如果是,我该怎么做,如果不是,它安全吗?

char command[150]={0};

 sprintf(command, "/mypath/mycommand > %s", FileName);

 system(command);

【问题讨论】:

  • 是的,如果您调用可能失败的函数,您应该始终检查错误。但是(对于这种情况,使用system)除非您尝试运行的命令针对命令本身中的特定错误返回特定错误代码,否则您将只知道该命令是否运行。它本身不是 C++ 函数,因此不会抛出异常。
  • 另外,sprintf 函数理论上也可能失败。很少有人从中检查错误,甚至没有经验丰富的程序员。我确实建议使用snprintf 代替,以减少缓冲区溢出的风险。或使用std::ostringstream
  • 第一个您可以检查文件本身是否存在。其次,在 I/O 操作期间必须进行异常处理。但是你必须自己做工作。我们可以提供指点,但您能否完成本应由您完成的工作。
  • 是的,我正在检查系统调用的返回值,但我更想知道该文件

标签: c++ file error-handling


【解决方案1】:

command 可能会溢出,如果 FileName 是 looooooooooooong。 system(3) 出错时返回 -1

man 3 system

错误时返回的值为 -1(例如 fork(2) 失败),并且 否则返回命令的状态。后一种返回状态是 以 wait(2) 中指定的格式。因此,命令的退出代码 将是 WEXITSTATUS(status)。如果 /bin/sh 无法执行, 退出状态将是执行 exit(127) 的命令的状态。

如果 command 的值为 NULL,则 system() 返回非零值,如果 shell 可用,否则为零。

system() 不会影响任何其他孩子的等待状态。

如果发生错误,可能应该删除输出文件。

【讨论】:

    【解决方案2】:

    我遵循的一般经验法则是墨菲定律:任何可能出错的事情最终都会出错。考虑到这一点,我总是检查错误和异常,除非有充分的理由认为检查错误是不必要或多余的。然而,这些情况大多也保持在最低限度。

    对于您的代码,我会提出同样的建议:忽略代码的错误代码总是安全的吗?如果代码遇到错误,是否有任何具体操作要做?查看您的代码,我相信很少有可能出错的地方(mycommand 被用户删除/移动/重命名,其执行权限已更改等)。这些会影响你程序的其余部分吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多