summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgerv%gerv.net <>2002-04-04 09:00:26 +0200
committergerv%gerv.net <>2002-04-04 09:00:26 +0200
commit13ed7e915263efa46216c6b69420ce9fd8881619 (patch)
treecb0d294649517c9a9454fd659469d495de1f99fe
parent9da893ceb544da6cd52a44383376cf7013ff7b22 (diff)
downloadbugzilla-13ed7e915263efa46216c6b69420ce9fd8881619.tar.gz
bugzilla-13ed7e915263efa46216c6b69420ce9fd8881619.tar.xz
Bug 126456 - improve our error handling. Patch by gerv, r=myk, bbaetz.
-rw-r--r--CGI.pl79
-rw-r--r--template/default/global/code-error.html.tmpl50
-rw-r--r--template/default/global/user-error.html.tmpl39
3 files changed, 156 insertions, 12 deletions
diff --git a/CGI.pl b/CGI.pl
index 9311ca8df..578c73a94 100644
--- a/CGI.pl
+++ b/CGI.pl
@@ -52,6 +52,8 @@ use CGI::Carp qw(fatalsToBrowser);
require 'globals.pl';
+use vars qw($template $vars);
+
# If Bugzilla is shut down, do not go any further, just display a message
# to the user about the downtime. (do)editparams.cgi is exempted from
# this message, of course, since it needs to be available in order for
@@ -1199,27 +1201,80 @@ sub PutFooter {
}
+###############################################################################
+# Error handling
+#
+# If you are doing incremental output, set $vars->{'header_done'} once you've
+# done the header.
+###############################################################################
+
+# DisplayError is deprecated. Use CodeError, UserError or TemplateError
+# instead.
sub DisplayError {
- my ($message, $title) = (@_);
- $title ||= "Error";
- $message ||= "An unknown error occurred.";
+ ($vars->{'error'}, $vars->{'title'}) = (@_);
+ $vars->{'title'} ||= "Error";
+
+ print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+ $template->process("global/user-error.html.tmpl", $vars)
+ || TemplateError($template->error());
+
+ return 1;
+}
+
+# For "this shouldn't happen"-type places in the code.
+# $vars->{'variables'} is a reference to a hash of useful debugging info.
+sub CodeError {
+ ($vars->{'error'}, $vars->{'variables'}) = (@_);
+ $vars->{'title'} = "Code Error";
+
+ # We may optionally log something to file here.
- print "Content-type: text/html\n\n";
- PutHeader($title);
+ print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+ $template->process("global/code-error.html.tmpl", $vars)
+ || TemplateError($template->error());
+
+ exit;
+}
- print PerformSubsts( Param("errorhtml") , {errormsg => $message} );
+# For errors made by the user.
+sub UserError {
+ ($vars->{'error'}, $vars->{'title'}, my $unlock_tables) = (@_);
+ $vars->{'title'} ||= "Error";
- PutFooter();
+ SendSQL("UNLOCK TABLES") if $unlock_tables;
+
+ print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+ $template->process("global/user-error.html.tmpl", $vars)
+ || TemplateError($template->error());
+
+ exit;
+}
- return 1;
+# If the template system isn't working, we can't use a template :-)
+# The Content-Type will already have been printed.
+sub TemplateError {
+ my ($error) = html_quote((@_));
+
+ print "<tt><p>
+ Bugzilla has suffered an internal error. Please save this page, and its
+ URL, and send it to ";
+ print Param("maintainer");
+ print ", with details of what you were doing at the time this message
+ appeared.</p>
+ <p>Template->process() failed: $error.</p></tt>";
+
+ exit;
}
+# PuntTryAgain is deprecated. Use UserError with the unlock_tables parameter.
sub PuntTryAgain ($) {
- my ($str) = (@_);
- print PerformSubsts(Param("errorhtml"),
- {errormsg => $str});
+ ($vars->{'error'}) = (@_);
+
SendSQL("UNLOCK TABLES");
- PutFooter();
+
+ $vars->{'header_done'} = "true";
+ $template->process("global/user-error.html.tmpl", $vars)
+ || TemplateError($template->error());
exit;
}
diff --git a/template/default/global/code-error.html.tmpl b/template/default/global/code-error.html.tmpl
new file mode 100644
index 000000000..4e73a7738
--- /dev/null
+++ b/template/default/global/code-error.html.tmpl
@@ -0,0 +1,50 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% UNLESS header_done %]
+ [% INCLUDE global/header %]
+[% END %]
+
+ <p>
+ <tt>
+ Bugzilla has suffered an internal error. Please save this page and send
+ it, and its URL, to [% Param("maintainer") %], with details of what you
+ were doing at the time this message appeared.
+ </tt>
+ </p>
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ [% error %]
+ </font>
+ </td>
+ </tr>
+</table>
+
+<pre>
+Variables:
+ [% FOREACH key = variables.keys %]
+ [%+ key %]: [%+ variables.$key %]
+ [% END %]
+</pre>
+
+[% INCLUDE global/footer %]
diff --git a/template/default/global/user-error.html.tmpl b/template/default/global/user-error.html.tmpl
new file mode 100644
index 000000000..1e8e34b01
--- /dev/null
+++ b/template/default/global/user-error.html.tmpl
@@ -0,0 +1,39 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% UNLESS header_done %]
+ [% INCLUDE global/header %]
+[% END %]
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ [% error %]
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p>
+ Please press <b>Back</b> and try again.
+</p>
+
+[% INCLUDE global/footer %]