带有die()的file1.php和file2.php; 功能.
include.php:
<? include 'file1.php';
include 'file2.php' ?>
Run Code Online (Sandbox Code Playgroud)
file1.php
<? echo 'included'; die(); ?>
Run Code Online (Sandbox Code Playgroud)
file2.php
<? echo 'not included'; die(); ?>
Run Code Online (Sandbox Code Playgroud)
如何用die()包含这两个文件; 功能?
我似乎无法在任何地方找到一个好的答案.如果我正在运行输出缓冲,并且a die()被触发,那么它ob_end_flush()也会启动吗?
在我用C完成的一些项目中,我喜欢使用以下类似于Perl的warn和die子例程的宏:
#include <stdio.h>
#include <stdlib.h>
#define warn(...) \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " at %s line %d\n", __FILE__, __LINE__)
#define die(...) \
warn(__VA_ARGS__); \
exit(0xFF)
Run Code Online (Sandbox Code Playgroud)
有没有像Perl的鲤鱼,呱呱,咯咯和鲤鱼的忏悔子程序那样存在的东西?我想从用户角度报告错误.
如果没有,我知道glibc中有backtrace()和backtrace_symbols()函数,它们与-rdynamic gcc选项一起可以为我提供函数名和代码地址的回溯.但我想要一些更好的东西; 可以访问调用堆栈中的文件,行和函数名称,如Perl的调用者子例程.我可以编写自己的libcarp用于我的c程序.
编辑:2009-10-19
我正在考虑在basename(argv [0])上创建使用gdb的东西,然后处理堆栈跟踪以生成我想要的不同类型的消息.它应该能够确定我是不是在可调试的可执行文件中,还是没有gdb的系统,在这种情况下,carp和cluck会变成警告并且Craok和confess将会死亡.
我之前从未使用过这样的gdb(我只在开始时使用我的程序运行它,而不是在它已经运行时).但我发现glib中的一些函数(g_on_error_stack_trace和stack_trace)看起来非常接近我想要做的事情:它使用参数basename(argv [0])和进程id分配gdb进程,然后写入其stdin(已被重定向到管道)命令"backtrace"后跟"退出".然后它从结果中读取并按照它喜欢的方式解析它.这几乎就是我需要做的.
我想将die消息重定向到一个单独的文件,以便我可以稍后比较该文件以确定出错的地方.
但是这段代码给了我错误:
$ cat test.pl
use strict;
use warnings;
my $log = "msglog.log";
die $log "DEAD$!";
$ perl test.pl
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";"
Execution of test.pl aborted due to compilation errors.
$
Run Code Online (Sandbox Code Playgroud)
我不想2>从来电者那里做一个.有没有办法从脚本中重定向它们?
我正在尝试操作PHP脚本,以便重定向到特定的URL,而不是给我一个MySQL错误.所以我离开了......
$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or die('MySQL error: '.mysql_error());
Run Code Online (Sandbox Code Playgroud)
......对此:
$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or header("Location: http://www.example.com");
Run Code Online (Sandbox Code Playgroud)
哪个有效,但有两件事与我有关.首先,它默认为302重定向,我更喜欢301重定向.其次,我担心通过从这一行删除die(),重定向后脚本没有正确退出.
现在,我已经在这里完成了一些功课,但是我无法弄清楚是否可以在这一行代码中将die()与header()的两个实例结合起来(即不改变这条特定行的内容) ).
首先,标题会暗示这是这个或这个的重复,但由于几个原因,这些答案对我不起作用,即使我最初的问题是相同的.我会解释原因.
我的问题是:我在我的代码中有几次我想发送标题和正文然后终止处理.与其他问题不同,我不能使用return或抛出异常(这些显然是为出于不同目的设计的不同函数而不是退出,这不是错误;它只是在某些特定情况下的早期运行时终止).
仍然,我想编写运行这些方法的单元测试,确保设置了适当的头文件(此处找到解决方案),输出主体是正确的($this->expectOutputString()在测试用例中使用-method 解决),然后继续测试.在这之间,exit意志会发生.
我已经@runInSeparateProcess在PHPUnit中尝试了-annotation,我也检查了test_helpers扩展,它有效,但我不想添加另一个扩展(建议测试也将在生产中运行)本机PHP代码打破了一切.必须有一种更简单的方法而不牺牲最佳实践.
有没有人有这个问题的好方法?
我正在编写一个perl脚本,在我正在检查用户在命令行上提供的选项的部分中,我想退出时出现错误,解释选项有什么问题.在这种情况下,不需要堆栈跟踪与此错误消息一起使用.那么,使用错误消息但没有堆栈跟踪或调试信息的最佳方法是什么?
我尝试过以下方法:
die "Invalid options";
Run Code Online (Sandbox Code Playgroud)
哪个产生
Invalid options at myscript.pl line 49.
Run Code Online (Sandbox Code Playgroud)
然后,我试过了
use Carp;
...
croak "Invalid options";
Run Code Online (Sandbox Code Playgroud)
哪个产生
Invalid options at myscript.pl line 47
main::prepare_output_directory() called at myscript.pl line 546
Run Code Online (Sandbox Code Playgroud)
那我怎么能Invalid options和别人一起死?
奖金问题:为什么croak告诉我错误是在第47行,当实际呼叫croak是在第49行?
我知道这$@是一个全局变量的事实,我仍然无法弄清楚为什么我需要在使用eval之前对其进行本地化:
例如:
eval { SOME_FUNC_THAT_MAY_DIE(); };
if ($@) {
print "An error occured!\n";
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一可能的事情是,如果某个信号处理程序会die在我尝试阅读的同时调用,$@我在这里缺少什么?
假设您使用 cpan(或其他外部)模块,就像我们在这里虚构的那样 Stupid::CPAN::Module::OfSatan
package Stupid::CPAN::Module::OfSatan {
BEGIN { $SIG{__DIE__} = sub { print STDERR "ERROR"; exit; }; }
}
Run Code Online (Sandbox Code Playgroud)
现在在你的代码中你有一些非常无辜的东西,
package main {
eval { die 42 };
}
Run Code Online (Sandbox Code Playgroud)
这将触发您的错误信号处理程序。你会想知道那个有问题的信号处理程序是在哪里定义的,所以你会做一些合乎逻辑的事情,比如插入一个Carp::Always,
package main {
use Carp::Always;
eval { die 42 };
}
Run Code Online (Sandbox Code Playgroud)
Carp::Always然后将覆盖有问题的信号处理程序,您的代码将神奇地工作。您如何调试引入错误信号处理程序的代码?