DBI connect(...) failed: ORA-12154: TNS:could not resolve the connect identifier specified (DBD ERROR: OCIServerAttach) at ...
我要怎么抓到这个?
要捕获和处理这种级别的错误,请以块形式使用 eval,“eval { ... }”。这将捕获子代码中发生的任何死亡。如果 eval 块中的代码死亡,它将设置 $@ 并且该块将返回 false。如果代码没有死,$@ 将被设置为 ''。
通过 SIG{WARN} 和 SIG{DIE} 使用信号处理很麻烦,因为它们是全局的,还需要考虑竞争条件(如果我在处理不同的信号时收到信号会发生什么?等等。基于信号的计算)。您可能正在编写单线程代码,因此您不必担心调用 die 的多个事物的并发问题,但是需要考虑用户(也许他会在您尝试打开 DBI 连接时发送 SIGKILL )
在这种特定情况下,您使用的是 DBI。使用 DBI,您可以控制发生错误时发生的情况,是否应该死、警告或静默失败,并等待您检查返回状态。
这是使用 eval { ... } 的基本示例。
my $dbh = eval { DBI->connect( @args) };
if ( $@ )
{
#DBI->connect threw an error via die
if ($@ =~ m/ORA-12154/i )
{
#handle this error, so I can clean up and continue
}
elsif ( $@ =~ m/SOME \s* other \s* ERROR \s+ string/ix )
{
#I can't handle this error, but I can translate it
die "our internal error code #7";
}
else
{
die $@; #re-throw the die
}
}
以这种方式使用 eval 有一些小问题,与 $@ 的全局范围有关。Try::Tiny cpan 页面有很好的解释。Try::Tiny 处理最小的 Try/catch 块设置并处理本地化 $@ 和处理其他边缘情况。