如果由于某些原因失败,大多数 $dbh 方法将:
- (if
RaiseError
选项设置为 0) 返回undef
- (if
RaiseError
选项设置为 1) 立即退出脚本 ('die'),并以退出消息形式给出错误原因。
这里的关键点是,如何处理错误取决于您。例如,如果您愿意,您可以忽略它们(以下显然适用于RaiseError
set to 0
only):
for my $db ( ... ) {
my $dbh = get_database_handle( $db )
or next;
...
}
在此片段中(从您在问题中提到的@ikegami的答案复制),您循环遍历数据库连接的一些设置列表;如果某些连接给你一个undef
,你只需去寻找另一个,并且不做任何错误。
不过,通常情况下,当错误发生时,你要做的不仅仅是“下一步”——但话又说回来,你有两个选择:要么检查each $dbh
- 相关声明如下:
$sth = $dbh->prepare('some_params')
or process_db_error('In prepare');
...
$res = $sth->execute('another_set_of_params')
or process_db_error('In execute');
...
$res->doAnythingElse('something completely different')
or process_db_error('In something completely different');
(as or
仅当其相应的“左侧部分”评估为时才会执行部分false
在布尔上下文中).
...或者只是将所有这些包装到 Perlish 的“try-catch”块中:
if (!eval {
$sth = $dbh->prepare('some_params');
...
$res = $sth->execute('another_set_of_params');
...
$res->doSomethingElse('something completely different')
...
1 # No exception
}) {
process_db_error($@);
}
选择什么,由您决定:这是“返回语句中的错误”(除了要获取实际错误,您必须询问 $dbh 对象)和异常之间的常见决定。
但底线是你不能只写这样的:
$sth = $dbh->do_something('that_can_result_in_error');
$sth->do_something('else');
...如果你确实设置了RaiseError
to 0
。在这种情况下脚本不会死,$sth
将被分配一个undef
,并且您会遇到“派生”错误(因为您无法调用方法undef
).
这正是您原来问题的代码最后部分所发生的情况。