Error handling improvement for preprocess hooks. It's now safe to call error() from...
authorJoey Hess <joey@kodama.kitenet.net>
Sun, 13 Jul 2008 18:41:40 +0000 (14:41 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Sun, 13 Jul 2008 18:41:40 +0000 (14:41 -0400)
IkiWiki.pm
debian/changelog
doc/plugins/write.mdwn

index d4e19c388fa19c8abfd75b6504b3190910e13536..80e31711062694fb9494306e5900df4ca54f8b2f 100644 (file)
@@ -768,21 +768,30 @@ sub preprocess ($$$;$$) { #{{{
                        }
                        my $ret;
                        if (! $scan) {
-                               $ret=$hooks{preprocess}{$command}{call}->(
-                                       @params,
-                                       page => $page,
-                                       destpage => $destpage,
-                                       preview => $preprocess_preview,
-                               );
+                               $ret=eval {
+                                       $hooks{preprocess}{$command}{call}->(
+                                               @params,
+                                               page => $page,
+                                               destpage => $destpage,
+                                               preview => $preprocess_preview,
+                                       );
+                               };
+                               if ($@) {
+                                       chomp $@;
+                                       $ret="[[!$command <span class=\"error\">".
+                                               gettext("Error").": $@"."</span>]]";
+                               }
                        }
                        else {
                                # use void context during scan pass
-                               $hooks{preprocess}{$command}{call}->(
-                                       @params,
-                                       page => $page,
-                                       destpage => $destpage,
-                                       preview => $preprocess_preview,
-                               );
+                               eval {
+                                       $hooks{preprocess}{$command}{call}->(
+                                               @params,
+                                               page => $page,
+                                               destpage => $destpage,
+                                               preview => $preprocess_preview,
+                                       );
+                               };
                                $ret="";
                        }
                        $preprocessing{$page}--;
index 375ae6078d195e278e1f8a0b88870f224e656947..d5b64df346378545c0f237068f0655501579721d 100644 (file)
@@ -20,6 +20,9 @@ ikiwiki (2.54) UNRELEASED; urgency=low
   * Move yesno function out of inline and into IkiWiki core, not exported.
   * meta: fix title() PageSpec (smcv)
   * Some footer style changes. (smcv)
+  * Error handling improvement for preprocess hooks. It's now safe to call
+    error() from such hooks; it will cause a nicely formatted error message
+    to be inserted into the page.
 
  -- Josh Triplett <josh@freedesktop.org>  Wed, 09 Jul 2008 21:30:33 -0700
 
index 6b49ec58d9379b86b8fc6c842bce8479401681d8..4dc55e30219667428cff64d57931683cb88ebd71 100644 (file)
@@ -412,12 +412,13 @@ Aborts with an error message. If the second parameter is passed, it is a
 function that is called after the error message is printed, to do any final
 cleanup.
 
-Note that while any plugin can use this for a fatal error, plugins should
-try to avoid dying on bad input when building a page, as that will halt
-the entire wiki build and make the wiki unusable. So for example, if a
-[[ikiwiki/PreProcessorDirective]] is passed bad parameters, it's better to
-return an error message, which can appear on the wiki page, rather than
-calling error().
+If called inside a preprocess hook, error() does not abort the entire
+wiki build, but instead replaces the [[ikiwiki/PreProcessorDirective]] with
+a version containing the error message.
+
+In other hooks, error() is a fatal error, so use with care. Try to avoid
+dying on bad input when building a page, as that will halt
+the entire wiki build and make the wiki unusable.
 
 #### `template($;@)`