<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:8pt"><div><span style="font-size: 10px;"><br></span></div><div><span style="font-size: 10px;">Wow Romain!! Dirk and U are really 
"Professional R (and C++) Enthusiast" !!!</span></div><div style="background-color: transparent;"><span style="font-size: x-small;"><br clear="none"></span></div><div style="background-color: transparent;"><span style="font-size: 10px;">The following tests verified your words. I just post them for the 
benefits of other readers in this list.</span></div><div style="background-color: transparent;"><span style="font-size: x-small;"><br clear="none"></span></div><div style="background-color: transparent;"><span style="font-size: x-small;">With the following C++ functions 
exported:</span></div><div style="background-color: transparent;"><span style="font-size: x-small;"><br clear="none"></span></div><div style="background-color: transparent;"><span style="font-size: x-small;">// 
[[Rcpp::export]]</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">void 
testErr0(SEXP x, const Function & FUN)</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">{</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "before call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
FUN(x);</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "after call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
return;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">}</span></div><div style="background-color: transparent;"><span style="font-size: x-small;"><br clear="none"></span></div><div style="background-color: transparent;"><span style="font-size: x-small;">// 
[[Rcpp::export]]</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">void 
testErr1(SEXP x, const Function & FUN)</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">{</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "before call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Language call(FUN, x) ;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
call.fast_eval();</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "after call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
return;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">}</span></div><div style="background-color: transparent;"><span style="font-size: x-small;"><br clear="none"></span></div><div style="background-color: transparent;"><span style="font-size: x-small;">// 
[[Rcpp::export]]</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">void 
testErr2(SEXP x, const Function & FUN)</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">{</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "before call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Language call(FUN, R_NilValue);</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Language::Proxy proxy(call, 1);</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
proxy = x;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
call.fast_eval();</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
Rcpp::Rcout << "after call" << std::endl;</span></div><div style="background-color: transparent;"><span style="font-size: x-small;">  
return;</span></div><div style="background-color: transparent;"></div><div style="background-color: transparent;"><span style="font-size: x-small;">}</span></div><div><span style="font-size: x-small;"><br clear="none"></span></div><div><span style="font-size: x-small;">I tested the error handling behaviors in 
R: (AnyError() is R my implementation of a simplifed tryCatch(). It returns TRUE 
or FALSE)</span></div><div><span style="font-size: x-small;"><br clear="none"></span></div><div>







































</div><div>
<div><span style="font-size: x-small;">> fff <- function(x) {x + 
1};</span></div>
<div><span style="font-size: x-small;">> testErr0(1:3, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">after call</span></div>
<div><span style="font-size: x-small;">> testErr1(1:3, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">after call</span></div>
<div><span style="font-size: x-small;">> testErr2(1:3, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">after call</span></div>
<div><span style="font-size: x-small;">> fff(letters[1:3]);<br clear="none"></span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> testErr0(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">Error: non-numeric argument to binary 
operator</span></div>
<div><span style="font-size: x-small;">> testErr1(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> testErr2(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> 
AnyError(fff(letters[1:3]));</span></div>
<div><span style="font-size: x-small;">[1] TRUE</span></div>
<div><span style="font-size: x-small;">> AnyError(testErr0(letters, fff));     
# !!! NO error throws by directly calling FUN</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">[1] FALSE</span></div>
<div><span style="font-size: x-small;">> AnyError(testErr1(letters, 
fff));</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">[1] TRUE</span></div>
<div><span style="font-size: x-small;">> AnyError(testErr2(letters, 
fff));</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">[1] TRUE</span></div>
<div><span style="font-size: x-small;">> debug(tryCatch);</span></div>
<div><span style="font-size: x-small;">> fff(letters[1:3]);</span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> testErr1(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> testErr2(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">Error in x + 1 : non-numeric argument to 
binary operator</span></div>
<div><span style="font-size: x-small;">> testErr0(letters, fff);</span></div>
<div><span style="font-size: x-small;">before call</span></div>
<div><span style="font-size: x-small;">debugging in: tryCatch(evalq(function 
(x)</span></div>
<div><span style="font-size: x-small;">{</span></div>
<div><span style="font-size: x-small;">    x + 1</span></div>
<div><span style="font-size: x-small;">}(c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j", "k", "l",</span></div>
<div><span style="font-size: x-small;">"m", "n", "o", "p", "q", "r", "s", "t", 
"u", "v", "w", "x", "y",</span></div>
<div><span style="font-size: x-small;">"z")), <environment>), error = 
.rcpp_error_recorder)</span></div>
<div><span style="font-size: x-small;">...</span></div>
<div><span style="font-size: x-small;"><br clear="none"></span></div>
<div><span style="font-size: x-small;">the key points are:</span></div>
<div><span style="font-size: x-small;">1. tryCatch() is NOT triggered using the 
methods provided by Romain.</span></div>
<div><span style="font-size: x-small;">2. errors are not thrown if we directly 
call a Function FUN. (Handled nicely by Rcpp in the expense of 
speed)</span></div>
<div><span style="font-size: 10px;"><br clear="none"></span></div></div>  </div></body></html>