Removing the duplicates - I built a bit of infrastructure to do this. There may be simpler solutions
In a class called Util, three methods:
public static void addVFPageMessage(ApexPages.Severity sev, String msg, Exception e) {
if (!Util.isExceptionAlreadyInVFMsgContext(e))
ApexPages.addMessage(new ApexPages.Message(sev,msg,
(e != null &&
(e.getTypeName() == 'System.DmlException' ||
e.getTypeName() == 'MyException'
)
? Util.friendlifyException(e.getMessage())
: Util.showException(e))
));
}
// ---------------------------------------
// friendlifyException
// ---------------------------------------
public static String friendlifyException(String errMsg) {
String res = errMsg;
String sysErrPrefix = 'FIELD_CUSTOM_VALIDATION_EXCEPTION,';
Integer sysErrPrefixIndex = errMsg.lastIndexOf(sysErrPrefix);
if (sysErrPrefixIndex != -1) // Strip out user unfriendly message prefix
res = errMsg.subString(sysErrPrefixIndex + sysErrPrefix.length());
String myErrPrefix = 'MyException';
Integer myErrPrefixIndex = errMsg.lastIndexOf(myErrPrefix);
if (myErrPrefixIndex != -1) // Strip out user unfriendly message prefix
res = errMsg.subString(myErrPrefixIndex + myErrPrefix.length());
Integer stackTraceIndex = res.indexOf('Class.');
if (stackTraceIndex != -1) // Strip out the stack trace at end of some messages
res = res.subString(0,stackTraceIndex);
return res;
}
// ------------------------------------------
// showException
// ------------------------------------------
public static String showException(Exception e) {
return e != null ? e.getTypeName() + ' ' + e.getMessage() + ' line:' + e.getLineNumber() + '\n' + e.getStackTraceString() : '';
}
and in a controller, I do the following:
// ----------------------------------------------------------------------------------------
// EXTENDED METHOD - save : Save as VF page
// ----------------------------------------------------------------------------------------
public PageReference save() {
PageReference resPg;
try{
update this.oppo;
}
catch(DmlException e){
Util.addVFPageMessage(ApexPages.Severity.ERROR,'[OCE-03] Save failed, reason: ',e);
}
return resPg;
}