关于Perl的内置错误指示 $!和 $ @ 的一个微不足道的问题。它们如何彼此不同,哪种更适合记录目的?
答案 0 :(得分:5)
$!
由系统调用错误设置。它对应于C的errno
变量。
$@
由eval EXPR
和eval BLOCK
设置。它包含捕获的异常。
$?
由waitpid
,system
和close
设置(关闭使用open '-|'
或open '|-'
打开的句柄时)。它包含有关已终止进程的信息。
大多数模块在出错时抛出异常,但有些模块设置了自己的错误变量(例如DBI,Text :: CSV_XS)。
记录的相应变量因您记录的内容而异。
例如,system
通过$?
和$!
报告错误。
system(...);
die("Unable to execute child: $!\n") if $? < 0;
die("Child killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("Child exited with error ".( $? >> 8 )."\n") if $? >> 8;
答案 1 :(得分:2)
他们有完全不同的目的。您应该记录哪些取决于失败的原因。 (别忘了$?)