这是"如何在Perl库中绕过'die'调用我无法修改?"的后续内容..
我有一个子程序,它调用一个库 - 崩溃 - 有时很多次.而不是使用eval {}在这个子例程中调用每个调用,我只是让它死掉,并在调用我的子例程的级别上使用eval {}:
my $status=eval{function($param);};
unless($status){print $@; next;}; # print error and go to
# next file if function() fails
Run Code Online (Sandbox Code Playgroud)
但是,我可以在函数()中捕获错误条件.在子例程和调用例程中设计错误捕获的最恰当/优雅的方法是什么,以便我获取捕获和未捕获错误的正确行为?
问题如下:
echo 'Hello...';
die('I died...');
echo 'HAHAHA!!!';
Run Code Online (Sandbox Code Playgroud)
在网络浏览器上,它在 die() 之后执行 echo。CLI 在 die() 上停止,并且没有按预期显示回显。
我的规格: PHP 7.4 (FPM) Web 服务器 Nginx (也尝试使用 apache 得到相同的结果)
另外,我在 Windows 上有一个很长一段时间的测试服务器,当调用 exit 或 die 时它正在退出脚本,但不知何故在 debian 测试服务器上没有这样做。
我有什么遗漏的吗?你们有什么建议吗?
提前致谢....
2022年7月27日更新:
@MarkusZeller yes 禁用了 opcache:

仍然无法正常工作...但在 php7.4.26 下的 Windows 服务器上以某种方式运行脚本并达到预期的模具
开发环境是带有 Debian 11 (WSL2) 的 Windows 我昨天也在我家里安装了基础 Debian 11 的测试机器上尝试过,它也有同样的问题。Debian 11 测试服务器的情况也是如此。
只是一个简单的问题.说一个像这样的方法
mysql_pconnect("server","tator_w","password")
or die("Unable to connect to SQL server");
Run Code Online (Sandbox Code Playgroud)
我可以将'die'调用方法而不是显示短信吗?如果是这样,怎么样?
我有以下代码.检查用户是否已登录.当变量$ is_logged_in未设置或为False时,我加载了一个消息视图.不幸的是,同时系统加载受限制的内容视图.所以我使用了die()函数,现在只显示一个空白页面.
如果用户未登录,我该怎么办才能加载邮件视图?谢谢.
if(!isset($is_logged_in) OR $is_logged_in == FALSE)
{
$data['main_content'] = 'not_logged_in';
$data['data'] = '';
$this->load->view('includes/template',$data);
die();
}
Run Code Online (Sandbox Code Playgroud) 当它只涉及脚本的一小部分并且我尝试时,我不想"死()":
$result = mysql_query($sql) or echo("error with responses");
Run Code Online (Sandbox Code Playgroud)
但它产生了一个错误.我如何只是发出错误消息并继续执行脚本的其余部分,因为即使它无法连接,其余部分也不会受到影响.
是否保持mysql_query() or die()打开mysql连接?我的想法是它打电话die()但它从不打电话mysql_close()给连接......
谢谢.
如果我的脚本被取消了die(),我可以以某种方式检查register_shutdown_function()吗?
像这样的东西:
register_shutdown_function('shutdown');
die('Calling die()');
function shutdown()
{
if (???)
{
// Script was canceled by die()
}
}
Run Code Online (Sandbox Code Playgroud)
注意:在我的网站上,我使用Smarty.所以也许检查,如果$smarty->display()被叫或类似的东西?
在 PHP 中,die()用于停止运行脚本以防止意外行为。在 Go 中,死一个句柄函数的惯用方法是什么?panic()或者return?
我的 Perl 脚本中有一个循环,用于准备和执行 SQL 语句,如下所示:
my $sql_1 = select * from TABLE;
my $sth_1 = $database->prepare($sql_1) or die "Failed to prepare SQL";
$sth_1->execute() or die "Failed to execute SQL";
my $results = sth_1-> fetchall_arrayref({});
my params_ins;
my params_del;
foreach my $row($results) {
params_ins = $row->{params_ins}
params_del = $row->{params_del}
my $sql_2 =
begin transaction
exec delete_sp(params_ins)
exec insert_sp(params_del)
end transaction
my $sth_2 = $database->prepare($sql_2) or die "Failed to prepare SQL";
$sth_2->execute();
}
Run Code Online (Sandbox Code Playgroud)
据我了解, die 会导致代码的执行停止。是否可以继续下一个循环而不是停止脚本的整个执行?例如,是否可以执行以下操作:
my $sth_2 = $database->prepare($sql_2) or continue; …Run Code Online (Sandbox Code Playgroud) 在以下代码中,eval检查表达式是否有效。它捕获一个异常,并且我的代码打印出异常,而代码不会在此时死亡。到现在为止还挺好。
但是当die;随后遇到一个表达式时,异常文本会再次打印出来,没有我的要求,并添加了一条...propagated消息,给出了die;命令的行号。但在这一点上,例外文本是不合适和混乱的。似乎 perl 会保留eval错误消息或异常消息,直到我们到达die;.
下面发布的代码下方是两种解决方法,其中任何一种都会使行为消失。
这种特殊行为记录在哪里?背后的想法是什么?
#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@)
{
print join('', 'qr/', $str, '/ does not compile: ',"\n", $@, );
}
print "Got past eval. But next, at 'die;', it will print an error message that no longer pertains.\n";
die;
Run Code Online (Sandbox Code Playgroud)
解决方法 (1)。给出die;一个非空字符串:
#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@) …Run Code Online (Sandbox Code Playgroud)