我已经在Amazon AWS上使用*Apache2/MySQL/PHP5安装了全新的Ubuntu Server 12.04 LTS.当我运行PHP脚本并遇到错误时,我没有看到PHP的任何错误报告,我所看到的就是
HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfil the request.
Run Code Online (Sandbox Code Playgroud)
我已经检查了我的/etc/php5/apache2/php.ini文件,据我所知,应该设置错误报告.文件的内容(关于错误)是:
; display_errors
; Default Value: On
; Development Value: On
; Production Value: Off
; display_startup_errors
; Default Value: Off
; Development Value: On
; Production Value: Off
; error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议吗?如果我尝试类似的东西$obj = new …
我遵循良好的编程习惯,我将PHP错误记录到文件而不是将其显示给用户.我用set_error_handler()它.
现在问题.例如,我有一个地方:
@file_exists('/some/file/that/is/outside/openbasedir.txt');
Run Code Online (Sandbox Code Playgroud)
但是,尽管有错误抑制操作符,错误消息仍会记录.我不希望这样.我希望抑制错误不要传递给我的错误处理程序.
我通过电子邮件使用django错误报告.它通常是一个非常有用的功能,除了现在我们有5分钟的数据库停机时间,我收到了2000封电子邮件.是否有任何中间件可以帮助我限制django每分钟发送的电子邮件数量?
我最近换成了MacBook,现在使用MAMP-stack进行本地开发.
在我早期的开发环境中,当我尝试通过Web浏览器访问PHP文件并发生错误时,我总能看到提供信息的错误报告.使用MAMP的默认安装似乎禁用了此功能,每当我遇到错误时我都看不到它的原因,我甚至看不到一行告知我发生了错误.
直到我开始在调试器中调试代码,我才能看到错误发生的位置.
知道如何打开错误报告吗?
我试过了:
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
虽然没有影响.
所以假设我碰巧在我的应用程序中有一个未处理的异常,或者由于某种原因它崩溃了.有什么方法让我捕获输出并在应用程序崩溃时显示错误报告对话框.
我在想的是在后台运行一个小程序,其唯一的工作就是监听主应用程序的异常退出,然后显示"报告"对话框,用户可以选择向我发送错误输出.
不确定如何实现这一点,或者这是否是正确的方法.
报告错误消息将是一项简单的任务,但我不知道如何捕获未处理异常的输出或获取退出代码(我假设程序在崩溃时会给出除0以外的退出代码).
在正确的方向上轻推是很棒的.
我想让您说明为什么有人不应该在PHP中使用尽可能高的错误报告级别?
设定最高水平的方法:
PHP <5.4:
error_reporting(E_ALL | E_STRICT);
Run Code Online (Sandbox Code Playgroud)
PHP> = 5.4:
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
PHP 所有版本(建议用于配置文件):
error_reporting(2147483647);
Run Code Online (Sandbox Code Playgroud)
PHP 所有版本(我的配置,-1将包含所有错误,并且易于记忆)
error_reporting(-1);
Run Code Online (Sandbox Code Playgroud)
我的经历:
有没有办法将MATLAB错误消息保存到文件中?
这可能是一个简单的问题,但谷歌无法给我答案.我编译了一个GUI可执行文件,可以在没有MATLAB许可证的情况下使用,偶尔会冻结.出于审美目的,我通常附带这样的可执行文件来抑制命令窗口,因此我无法通过命令提示符输出错误消息.我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试.
谢谢!
使用error_reporting()或ini_set('error_reporting')在我的脚本中,两者之间是否存在功能差异?一种方法比另一种方法更受欢迎吗?
对于它的价值,我看到很多框架都在使用error_reporting(),但两个选项似乎只在运行时设置,然后在脚本执行后重置回php.ini中的默认值.
我有一个ANTLR 4语法,并从中构建了一个词法分析器和解析器.现在我试图以这样的方式实例化该解析器,它将解析直到遇到错误.如果遇到错误,则不应继续解析,但应提供有关问题的有用信息; 理想情况下是机器可读的位置和人类可读的消息.
这就是我现在所拥有的:
grammar Toy;
@parser::members {
public static void main(String[] args) {
for (String arg: args)
System.out.println(arg + " => " + parse(arg));
}
public static String parse(String code) {
ErrorListener errorListener = new ErrorListener();
CharStream cstream = new ANTLRInputStream(code);
ToyLexer lexer = new ToyLexer(cstream);
lexer.removeErrorListeners();
lexer.addErrorListener(errorListener);
TokenStream tstream = new CommonTokenStream(lexer);
ToyParser parser = new ToyParser(tstream);
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
parser.setErrorHandler(new BailErrorStrategy());
try {
String res = parser.top().str;
if (errorListener.message != null)
return "Parsed, but " + errorListener.toString();
return …Run Code Online (Sandbox Code Playgroud) 有哪些更好的方法可以避免isset()应用程序逻辑中的大量内容,并且在需要时保留查看调试消息(E_NOTICE)的能力?
首先推定:E_NOTICE不是错误,它是用词不当,实际上应该是E_DEBUG.然而,虽然这对于未设置的变量(PHP仍然是脚本语言)是正确的,但是一些文件系统函数等也会抛出它们.因此,需要开发 E_NOTICEs.
然而,并非所有调试通知都是有用的,这就是为什么在整个应用程序逻辑中引入isset()和@ 是一个常见的(不幸的)PHP习惯.isset/empty肯定有很多有效的用例,但总的来说它似乎是语法盐,实际上可能阻碍调试.
这就是我目前使用error_reporting书签和哑开/关开关的原因:
// javascript:(function(){document.cookie=(document.cookie.match(/error_reporting=1/)?'error_reporting=0':'error_reporting=1')})()
if (($_SERVER["REMOTE_ADDR"] == "127.0.0.1")
and $_COOKIE["error_reporting"])
{
error_reporting(E_ALL|E_STRICT);
}
else {/* less */}
Run Code Online (Sandbox Code Playgroud)
然而,这仍然让我有一个问题,即一旦启用就有太多通知来搜索.作为解决方法,我可以使用@ error suppress运算符.与isset()不同,它不会完全终止调试选项,因为自定义错误处理程序仍然可以接收抑制的E_NOTICE.因此,将预期的调试通知与潜在问题分开可能会有所帮助.
然而,这同样令人不满意.因此问题.有没有人使用或知道更复杂的PHP错误处理程序.我在想象:
当然,某些框架必须已经有这样的用户错误处理程序.
哦,我有人请帮助改写这个.冗长的解释失败了.