标签: die

如何在Perl子例程中处理捕获和未捕获的错误?

这是"如何在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)

但是,我可以在函数()中捕获错误条件.在子例程和调用例程中设计错误捕获的最恰当/优雅的方法是什么,以便我获取捕获和未捕获错误的正确行为?

error-handling perl die

5
推荐指数
1
解决办法
292
查看次数

die() 不会停止代码执行

问题如下:

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日更新:

脚本: 在此输入图像描述

浏览器输出: 在此输入图像描述

CLI 输出 在此输入图像描述

我已经更新了 PHP 版本(同样的情况): 在此输入图像描述

@MarkusZeller yes 禁用了 opcache: 在此输入图像描述

仍然无法正常工作...但在 php7.4.26 下的 Windows 服务器上以某种方式运行脚本并达到预期的模具

开发环境是带有 Debian 11 (WSL2) 的 Windows 我昨天也在我家里安装了基础 Debian 11 的测试机器上尝试过,它也有同样的问题。Debian 11 测试服务器的情况也是如此。

@YourCommonSense 脚本是相同的。这是 nginx 路径配置: 在此输入图像描述

php cgi exit die fpm

5
推荐指数
1
解决办法
495
查看次数

PHP死的问题

只是一个简单的问题.说一个像这样的方法

mysql_pconnect("server","tator_w","password")
               or die("Unable to connect to SQL server");
Run Code Online (Sandbox Code Playgroud)

我可以将'die'调用方法而不是显示短信吗?如果是这样,怎么样?

php die

4
推荐指数
1
解决办法
467
查看次数

CodeIgniter:如果我使用die()函数,View不会加载

我有以下代码.检查用户是否已登录.当变量$ 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)

php codeigniter views die

4
推荐指数
1
解决办法
3677
查看次数

在PHP脚本中处理错误和继续执行

当它只涉及脚本的一小部分并且我尝试时,我不想"死()":

$result = mysql_query($sql) or echo("error with responses");
Run Code Online (Sandbox Code Playgroud)

但它产生了一个错误.我如何只是发出错误消息并继续执行脚本的其余部分,因为即使它无法连接,其余部分也不会受到影响.

php die execution

4
推荐指数
2
解决办法
2400
查看次数

"mysql_query()或die()"是否会保持打开的mysql连接?

是否保持mysql_query() or die()打开mysql连接?我的想法是它打电话die()但它从不打电话mysql_close()给连接......

谢谢.

php mysql database connection die

4
推荐指数
2
解决办法
3460
查看次数

register_shutdown_function()和die()

如果我的脚本被取消了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 smarty die

4
推荐指数
1
解决办法
3450
查看次数

如何在 Go 中实现 PHP 函数 `die()`(或 `exit()`)?

在 PHP 中,die()用于停止运行脚本以防止意外行为。在 Go 中,死一个句柄函数的惯用方法是什么?panic()或者return

exit die go

4
推荐指数
1
解决办法
3224
查看次数

在 Perl 中继续而不是“或死”

我的 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)

syntax perl loops continue die

3
推荐指数
1
解决办法
230
查看次数

perl eval“...传播”在哪里记录

在以下代码中,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)

perl eval exception die

3
推荐指数
1
解决办法
73
查看次数

标签 统计

die ×10

php ×6

perl ×3

exit ×2

cgi ×1

codeigniter ×1

connection ×1

continue ×1

database ×1

error-handling ×1

eval ×1

exception ×1

execution ×1

fpm ×1

go ×1

loops ×1

mysql ×1

smarty ×1

syntax ×1

views ×1