On Wed, Oct 19, 2011 at 7:39 PM, Jed Brown <span dir="ltr"><<a href="mailto:jedbrown@mcs.anl.gov">jedbrown@mcs.anl.gov</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div>#define CHKERRXX(n)            do {if (PetscUnlikely(n)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,__SDIR__,n,PETSC_ERROR_IN_CXX,0);}} while(0)</div><div><br></div><div>Inside PetscError():</div>

<div><br></div><div>  if (p == PETSC_ERROR_IN_CXX) {</div><div>    const char *str;</div><div>    if (eh->ctx) {</div><div>      std::ostringstream *msg; </div><div>      msg = (std::ostringstream*) eh->ctx;</div><div>

      str = msg->str().c_str();</div><div>    } else {</div><div>      str = "Error detected in C PETSc";</div><div>    }</div><div>    throw PETSc::Exception(str);</div><div>  }</div><div><br></div><div>This causes SEGV because eh is NULL when propagating an error from C (the caller checks a return code using CHKERRXX). This seems like a logic error, but I don't know what was intended.</div>

<div><br></div><div>I changed this to if (eh && eh->ctx) which fixes the SEGV, but I don't know if something else was intended. I only pushed this to petsc-dev, but once we decide on the "right" fix, it should be ported to petsc-3.2.</div>

</blockquote></div><br>This was intended to get PETSc-like error checking from C++-style functions that throw exceptions. This was mostly for code I<div>wrote I think. Your fix is fine.</div><div><br></div><div>After several years of this, I am now of the opinion that exceptions suck all the way, and I should rewrite all my C++ to use</div>
<div>return values. The stack does not get wiped out, you can still catch specific errors, and propagate ones you do not catch.</div><div>Does anyone have any serious defense of exceptions?</div><div><br></div><div>I think we should retain the code for interoperability with C++-heads.</div>
<div><br></div><div>   Matt<br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener<br>
</div>