Have your function return a BOOL
instead, with the error message string as a parameter, like:
BOOL Calculate(double &result, double a, double b, char *pMsg, size_t nMsgSize)
{ try
{ result = InternalCalculation(a, b);
}
catch(std::invalid_argument& e)
{ strncpy_s(pMsg, nMsgSize, e.what(), _TRUNCATE);
return FALSE;
}
return TRUE;
}
and invoke it like
StringBuilder sErr = new StringBuilder(256);
if (!Calculate(out result, 2, 3, sErr, 256))
MessageBox.Show(sErr);