[Rd] C/C++ 'assert' should not be used in R packages
Bill Dunlap
bill at insightful.com
Sun Nov 11 02:04:28 CET 2007
On Sat, 10 Nov 2007, Duncan Murdoch wrote:
> Prof Brian Ripley wrote:
> > Please don't use 'assert' in R packages. If called, this means that an
> > error in your code aborts the whole R process, including your user's work.
> > I see several R packages doing this, and one of them called 'assert' on me
> > earlier in the week.
> >
> I partly disagree about this. If assert() is triggered, it clearly
> indicates a bug in the package. If it just generated an R error, most
> users would ignore it, and not report it to the package maintainer.
>
> It may well be that when an assertion fails, none of the subsequent
> calculations are reliable, in which case returning control to the user
> could result in data corruption. That's worse than losing a session,
> because at least when you lose a session, you know it.
I would think one would want to call assert() before doing something
that might corrupt the session. Sometimes you cannot arrange to
do that, but most times you can.
I think it would be nice to have a class of "programmer errors",
as opposed to "user errors". (A user error is when the user enters
inappropriate data for the function and a programmer error is
when the inputs are appropriate but the code in the package is bad.)
Supply functions at the R and C levels (assert() and Rf_assert(),
respectively?) to throw such errors. They would work about the
same as stop() and Rf_error() do (longjmp to main input loop),
but would print something like
'Internal/programmer error, report to authorities: n<0'
instead of
'Error: n is negative'
If the message automatically included the package name, file name,
and line number for C code, so much the better, but the text of the message
should identify it.
You could install a special error handler for that class of errors
if you wished.
> Could we write our own implementation of assert() that displays an R
> error and unloads the package? I think I could do something like that
> in Windows by calling FreeLibrary to unload the DLL, but I'd prefer a
> cross-platform solution.
----------------------------------------------------------------------------
Bill Dunlap
Insightful Corporation
bill at insightful dot com
360-428-8146
"All statements in this message represent the opinions of the author and do
not necessarily reflect Insightful Corporation policy or position."
More information about the R-devel
mailing list