]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 126456 - improve our error handling. Patch by gerv, r=myk, bbaetz.
authorgerv%gerv.net <>
Thu, 4 Apr 2002 07:00:26 +0000 (07:00 +0000)
committergerv%gerv.net <>
Thu, 4 Apr 2002 07:00:26 +0000 (07:00 +0000)
CGI.pl
template/default/global/code-error.html.tmpl [new file with mode: 0644]
template/default/global/user-error.html.tmpl [new file with mode: 0644]

diff --git a/CGI.pl b/CGI.pl
index 9311ca8df17e5a43bc67a42585676efc6202490a..578c73a94b732f949319c784493eebd2e2522b8b 100644 (file)
--- 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 (file)
index 0000000..4e73a77
--- /dev/null
@@ -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 (file)
index 0000000..1e8e34b
--- /dev/null
@@ -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 %]