记录一个测试时候遇到的System.StringException以及debug过程
记录一个测试时候遇到的System.StringException以及debug过程
前言
今天在跑Test Class时候遇到一个挺奇怪的BUG。之前100%覆盖的代码,突然有两三个case死活就是跑不过去了。
DEBUG
try-catch看log
我就只好加了try-catch。并且输出exception时候极其的全乎。期待能找到问题在哪。
try {
// function
} catch (Exception e) {
System.debug('Exception type caught: ' + e.getTypeName());
System.debug('Message: ' + e.getMessage());
System.debug('Cause: ' + e.getCause()); // returns null
System.debug('Line number: ' + e.getLineNumber());
System.debug('Stack trace: ' + e.getStackTraceString());
}
选择只跑第一个失败的case03。log输出:
20:27:28:539 USER_DEBUG [230]|DEBUG|Exception type caught: System.StringException
20:27:28:540 USER_DEBUG [231]|DEBUG|Message: Invalid id: 20220315ZZ
20:27:28:540 USER_DEBUG [232]|DEBUG|Cause: null
20:27:28:540 USER_DEBUG [233]|DEBUG|Line number: -1
20:27:28:540 USER_DEBUG [234]|DEBUG|Stack trace: External entry point
20:27:26:000 USER_DEBUG Class.TestProcessAbstractBase.execute: line 42, column 1
20:27:26:000 USER_DEBUG Class.TestProcessTest.Test03: line 299, column 1
这里的20220315ZZ是一个12位的字符串明显不符合Salesforce ID的形式:18位(旧的有可能是16位)不规律ID。所以Message是Invalid id。这其实是一个线索。
尝试查看log输出错误的行号
299行指向的就是调用的主方法,说了跟没说一样
System.debug
看来try-catch并不能告诉我准确的Exception发生在哪一行,那就只好用System.debug()方法了。
在可疑的地方加上就可以缩小范围。最终也是靠它解决了问题。
结果
通过log可知,有输出则无问题,直到报错的地方。
Map<Id, Account> detailMap = new Map<Id, Account>();
for(Account detail : accountList){
detailMap.put(detail.AccountNo__c.left(8) + detail.AccountNo__c.right(2), detail);
}
问题就出在:
Map<Id, Account> detailMap = new Map<Id, Account>(); detailMap的类型。
往一个Key为Id类型里放入 String的Key,String与Id类型不匹配,报出了System.StringException异常所以会提示Message: Invalid id.
解决方法
Map<Id, Account> detailMap = new Map<Id, Account>();
改为
Map<String, Account> detailMap = new Map<String, Account>();
问题解决。
浙公网安备 33010602011771号