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.

master
Joey Hess 2008-07-13 14:41:40 -04:00
parent 2bd4dea7f0
commit edb59cd5b9
3 changed files with 31 additions and 18 deletions

View 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}--;

3
debian/changelog vendored
View 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

View 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($;@)`