我使用对象的配置添加了一些自定义验证。我正在通过 Visualforce 页面插入该对象记录。我在我的 Visualforce 页面上添加了
<apex:pageMessages/>
。我还编写了用于捕获异常并在 VF 页面上显示错误消息的代码块。请在下面找到代码块:
catch(DMLException excp)
{
ApexPages.Message msg = new ApexPages.Message(Apexpages.Severity.ERROR, excp.getMessage() );
ApexPages.addMessage(msg);
return null;
}
我仍然无法从自定义验证中仅获取错误消息。它向我显示如下错误:
插入失败。第 0 行的第一个异常;第一个错误: FIELD_CUSTOM_VALIDATION_EXCEPTION, error_message_from_custom_validation_comes_here
这个问题有什么解决办法吗?
您需要像这样获取 DML 消息:
ApexPages.Message msg = new ApexPages.Message(Apexpages.Severity.ERROR, excp.getdmlMessage(0) );
ApexPages.addMessage(msg);
最好的方法是使用addMessages,注意复数。它的优点是仅显示消息详细信息,对于批量操作,相同的消息仅显示一次,我个人最喜欢的是:它只有一行,因此如果它是不可测试的异常,则覆盖率会更高。
try {
//failed dml operation
} catch(DmlException excp) {
ApexPages.addMessages(excp);
}
try{
...
} catch (DMLException ex){
String errorMessage = ex.getMessage();
Integer occurence;
if (ex.getMessage().contains('FIELD_CUSTOM_VALIDATION_EXCEPTION')){
occurence = errorMessage.indexOf('FIELD_CUSTOM_VALIDATION_EXCEPTION,') + 34;
errorMessage = errorMessage.mid(occurence, errorMessage.length());
occurence = errorMessage.lastIndexOf(':');
errorMessage = errorMessage.mid(0, occurence);
}
else {
errorMessage = ex.getMessage();
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, errorMessage));
}
通过在 Miguel 的代码中再使用一个字符串函数,将为您提供准确的“验证错误消息”。 谢谢米格尔。你的代码对我有帮助。 希望这有帮助。
str = errorMessage.substringBefore(':');
我在 LWC 中遇到了同样的问题,试图避免显示“FIELD_CUSTOM_VALIDATION_EXCEPTION”消息。我通过在显示错误消息的部分输入此代码解决了这个问题:
this.showSpinner = false;
// 提取错误信息 让 errorMessage = data.error;
if (errorMessage.includes('FIELD_CUSTOM_VALIDATION_EXCEPTION')) {
// Delete the previous part to the error message
errorMessage = errorMessage.split('FIELD_CUSTOM_VALIDATION_EXCEPTION,')
[1].trim();
}
//显示干净的错误消息 this.showToast('错误', errorMessage, '错误', '可关闭');
希望这个解决方案能够帮助您!