如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?
Posted
技术标签:
【中文标题】如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取\'0\')”?【英文标题】:How to Catch "TypeError: Cannot read properties of undefined (reading '0')" with custom error message?如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”? 【发布时间】:2021-12-09 00:22:05 【问题描述】:如何捕获不存在的属性的错误? 示例:
const arr = [
neighbours: ['AFG', 'CNG'],
,
];
现在,当我尝试访问可能存在或不存在的属性时,如果它不存在,那么如何使用自定义消息抛出和捕获错误?
try
const nearBorder = arr[0].borders[0];
// Above statement returns Error: Cannot read properties of undefined (reading '0')"
// Now how to throw above error with custom error message?
if (!nearBorder)
throw new Error('No neighbour found!');
else
console.log(`Your border is $nearBorder`);
catch (err)
console.log(err);
输出:TypeError: Cannot read properties of undefined (reading '0')
我知道,如果我通过如下所示的可选更改检查属性是否存在,那么我可以使用undefined
抛出自定义消息:
try
const nearBorder = arr[0].borders?.[0]; // returns undefined, NOT the actual error
if (!nearBorder)
throw new Error('No neighbour found!');
else
console.log(`Your border is $nearBorder`);
catch (err)
console.log(err);
在上面的行中,undefined
是可以捕获的,但不是实际的错误。但是如何使用自定义错误消息捕获实际错误'Cannot read properties of undefined (reading '0')'
?
输出:Error: No neighbour found!
【问题讨论】:
【参考方案1】:您可以将 throw 语句移动到 catch 块内。
const arr = [
neighbours: ['AFG', 'CNG']
]
try
let nearBorder = arr[0].borders[0];
if (nearBorder)
console.log(`Your border is $nearBorder`);
catch (e)
throw new Error('No neighbour found.');
更新
const arr = [
neighbours: ['AFG', 'CNG']
];
let propToCheck = 'borders';
if (!arr[0].hasOwnProperty(propToCheck))
throw new Error(`$propToCheck not found`);
【讨论】:
如果出现多个错误怎么办?我期待 API 返回并使用他们自己的自定义错误消息检查多个属性?所以至少要知道日志的错误?谢谢 在这种情况下,您可以检查该属性是否存在于对象上。在您的示例中,您想检查您的 arr[0] 对象上是否存在borders 属性并抛出您的自定义消息。请参阅我的答案中的更新代码。以上是关于如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JAX-RS 异常上的自定义消息设置 40X 错误?
Spring Reactive WebFlux - 如何自定义 BadRequest 错误消息