我正在开发一些项目.我想控制不同的错误.我知道在所有流行的框架和php项目中都有不同的异常.但我认为这不是必需的工作.如果发生错误,我们可以使用我们的消息制作die().1.例外的主要优点是什么?2.我可以用die()控制我的错误吗?
谢谢.
以下是我尝试执行的代码
$a=0;
if($a==0){die print"zero"};
Run Code Online (Sandbox Code Playgroud)
我得到如下输出
1 at test.pl line 2
Zero
Run Code Online (Sandbox Code Playgroud)
我想知道1首先打印的是什么,是不是像die这样打印if语句返回的值?任何帮助都会得到满足
我想写点:
die "Error in file $0 line number $line_number_of_this_cmd_in_file \n";
Run Code Online (Sandbox Code Playgroud)
在我的perl脚本文件中.
有帮助吗?多谢!
(perl 5)
代码段:
my $tz = DateTime::TimeZone->new(name => 'America/San_Francisco');
Run Code Online (Sandbox Code Playgroud)
这会立即死亡,因为America/San_Francisco它不是公认的时区.
打印以下消息:
无法加载时区'America/San_Francisco',或者名称无效.
我想在脚本退出之前处理此错误并为用户打印其他信息.我尝试过使用unless,但没有运气die.
如何才能做到这一点?
我正在编写一个Perl管道,一个调用各种其他程序的脚本,并管理从一个到另一个的数据传递.脚本(称之为pipeline.pl)和它管理的各种子脚本共享一个subroutines.ph通过require subroutines.ph指令定义和包含的公共子程序列表.
其中一个是一个函数,其工作是退出打印错误消息(实际的子例程也做了一些其他工作,但它们在这里没有关系;不,我不是重新发明die()):
## subroutines.ph
sub errorDie
{
my ($errMsg) = @_;
## various other cleanup tasks here
die($errMsg);
}
1;
Run Code Online (Sandbox Code Playgroud)
并且,在pipeline.pl:
#!/usr/bin/perl
require 'subroutines.ph';
errorDie("foo")
Run Code Online (Sandbox Code Playgroud)
运行上面的脚本会导致:
foo at subroutines.ph line 5.
Run Code Online (Sandbox Code Playgroud)
是否可以让它报告类似于:
foo at pipelines.pl line 4.
Run Code Online (Sandbox Code Playgroud)
因此,die()它不应报告找到的行,而应报告errorDie调用子例程的原始脚本行.我知道我可以通过在$errMsg变量中包含行来实现这一点,但这很脆弱且很麻烦.这可以自动完成吗?外部文件中定义的子程序能否检测到它的调用位置?
我知道如何覆盖内置的函数perl,我已经覆盖die warn say,因为print并且printf无法覆盖我已将它绑定到我的日志框架的句柄.
覆盖示例warn:
BEGIN{ *CORE::GLOBAL::warn = sub {
my ($package, $filename, $line, $subroutine) = caller;
untie *STDERR;
my $message;
foreach my $arg (@_) {
$message = $message.$arg;
}
print STDERR $message;
tie *STDERR, __PACKAGE__, (*STDERR);
logmessage("warn",$message,$filename, $line);
return;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以croak cluck confess carp从carp模块中覆盖Perl吗?
我有以下代码
print "Starting..\n";
eval { die "Before die sub redefinition\n" };
#die "Before die sub redefinition\n";
BEGIN {
print "inside Begin block\n";
*CORE::GLOBAL::die = sub {
my ($message) = @_;
print "Message: " . $message ."\n";
}
}
eval { die "Right after begin block\n" };
print "done\n";
Run Code Online (Sandbox Code Playgroud)
输出如下,
inside Begin block
Starting..
Message: Right after begin block
done
Run Code Online (Sandbox Code Playgroud)
BEGIN块在任何其他语句之前首先执行;但是重新定义的CORE::Global::die只有在重新定义后才有效。Firstdie不使用重新定义的版本,而是使用原始版本。有人可以帮我找出原因吗?
假设我有一些像这样的代码:
<html>
<head><title>Title</title></head>
<body>
<?php
if (!$someCondition){
die();
}
else{
#Do something
}
?>
</body>
<html>
Run Code Online (Sandbox Code Playgroud)
我希望这段代码的目的很简单.如果满足某个条件(即无法连接到数据库),那么程序应该死掉,否则它应该执行.执行die()函数时出现问题.它停止右那里,只发送前三行的浏览器,但不是最后两行.
是否有一个功能,我可以使用而不是die(),以便php块将停止执行,但静态HTML文本仍然通过?
如果我订
$myVar = "yay";
die($myVar);
Run Code Online (Sandbox Code Playgroud)
那回声出来耶,并杀死脚本.
但是,如果我设置
$myVar = 2;
die($myVar);
Run Code Online (Sandbox Code Playgroud)
没有回声.
这是为什么?
干杯伙计们.
我已经die在perl中覆盖了我的日志框架,因此它可以记录消息并在控制台上打印它.
被覆盖的骰子代码:
BEGIN{ *CORE::GLOBAL::die = sub {
my ($package, $filename, $line, $subroutine) = caller;
untie *STDERR;
my $message;
foreach my $arg (@_) {
$message = $message.$arg;
}
print STDERR $message;
tie *STDERR, __PACKAGE__, (*STDERR);
logmessage("die",$message,$filename, $line);
#What exit code to pass?
#exit CODE;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道退出进程时要设置的退出代码,因为正常的die退出时出现错误代码.
有什么方法可以找出调用die时要设置的退出代码吗?
如果可以知道perl中可用的错误代码列表会有帮助吗?
die ×10
perl ×7
php ×3
carp ×1
coding-style ×1
exception ×1
line-numbers ×1
oop ×1
overriding ×1
subroutine ×1