From 13ed7e915263efa46216c6b69420ce9fd8881619 Mon Sep 17 00:00:00 2001 From: "gerv%gerv.net" <> Date: Thu, 4 Apr 2002 07:00:26 +0000 Subject: Bug 126456 - improve our error handling. Patch by gerv, r=myk, bbaetz. --- CGI.pl | 79 +++++++++++++++++++++++----- template/default/global/code-error.html.tmpl | 50 ++++++++++++++++++ template/default/global/user-error.html.tmpl | 39 ++++++++++++++ 3 files changed, 156 insertions(+), 12 deletions(-) create mode 100644 template/default/global/code-error.html.tmpl create mode 100644 template/default/global/user-error.html.tmpl 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 "

+ 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.

+

Template->process() failed: $error.

"; + + 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 + #%] + +[% UNLESS header_done %] + [% INCLUDE global/header %] +[% END %] + +

+ + 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. + +

+ + + + + +
+ + [% error %] + +
+ +
+Variables:
+  [% FOREACH key = variables.keys %]
+    [%+ key %]: [%+ variables.$key %]
+  [% END %]
+
+ +[% 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 + #%] + +[% UNLESS header_done %] + [% INCLUDE global/header %] +[% END %] + + + + + +
+ + [% error %] + +
+ +

+ Please press Back and try again. +

+ +[% INCLUDE global/footer %] -- cgit v1.2.3-24-g4f1b