We demonstrate improved recovery from disallowed parameters. For this, we use a polynomial PDF of the form  
\[
   \mathrm{Pol2} = \mathcal{N} \left( c + a_1 \cdot x + a_2 \cdot x^2 + 0.01 \cdot x^3 \right),
 \]
 where \( \mathcal{N} \) is a normalisation factor. Unless the parameters are chosen carefully, this function can be negative, and hence, it cannot be used as a PDF. In this case, RooFit passes an error to the minimiser, which might try to recover.
[#1] INFO:Fitting -- RooAbsPdf::fitTo(pol3_over_pol3_Int[x]) fixing normalization set for coefficient determination to observables in data
[#1] INFO:Fitting -- using generic CPU library compiled with no vectorizations
[#1] INFO:Fitting -- Creation of NLL object took 952.942 μs
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_pol3_over_pol3_Int[x]_pol3Data) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#0] ERROR:Minimization -- RooMinimizer: all function calls during minimization gave invalid NLL values!
[#0] ERROR:Minimization -- RooMinimizer::calculateHessErrors() Error when calculating Hessian
[#0] ERROR:Minimization -- RooMinimizer: all function calls during minimization gave invalid NLL values!
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
[#0] ERROR:Eval -- RooAbsReal::logEvalError(pol3) evaluation error, 
 origin       : RooPolynomial::pol3[ x=x coefList=(a1,a2,a3) ]
 message      : p.d.f normalization integral is zero or negative: -2220.000000
 server values: x=x=0, coefList=(a1 = 10 +/- 0,a2 = -1 +/- 0,a3 = 0.01)
 
 
 
-------------- Starting second fit ---------------
 
 
[#1] INFO:Fitting -- RooAbsPdf::fitTo(pol3_over_pol3_Int[x]) fixing normalization set for coefficient determination to observables in data
[#1] INFO:Fitting -- Creation of NLL object took 139.531 μs
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_pol3_over_pol3_Int[x]_pol3Data) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
Minuit2Minimizer: Minimize with max-calls 1000 convergence for edm < 1 strategy 1
Minuit2Minimizer : Valid minimum - status = 0
FVAL  = -1002.2262595660759
Edm   = 2.95538313214564806e-09
Nfcn  = 251
a1   = -0.498159   +/-  0.0227242   (limited)
a2   = 0.198316    +/-  0.00564906  (limited)
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
 
  RooFitResult: minimized FCN value: 0, estimated distance to minimum: 0
                covariance matrix quality: Not calculated at all
                Status : MINIMIZE=-1 HESSE=302 
 
    Floating Parameter    FinalValue +/-  Error   
  --------------------  --------------------------
                    a1    1.0000e+01 +/-  0.00e+00
                    a2   -1.0000e+00 +/-  0.00e+00
 
Without recovery, the fitter encountered 23 invalid function values. The parameters are unchanged.
 
 
  RooFitResult: minimized FCN value: 29650.9, estimated distance to minimum: 2.95925e-09
                covariance matrix quality: Full, accurate covariance matrix
                Status : MINIMIZE=0 HESSE=0 
 
    Floating Parameter    FinalValue +/-  Error   
  --------------------  --------------------------
                    a1   -4.9816e-01 +/-  2.27e-02
                    a2    1.9832e-01 +/-  5.65e-03
 
With recovery, the fitter encountered 23 invalid function values, but the parameters are fitted.