为啥异常在 $exceptionHandler 函数中没有属性以及如何解决此限制? DataCloneError [重复]
Posted
技术标签:
【中文标题】为啥异常在 $exceptionHandler 函数中没有属性以及如何解决此限制? DataCloneError [重复]【英文标题】:Why exception doesn't have properties in the $exceptionHandler function and how to workaround this limitation? DataCloneError [duplicate]为什么异常在 $exceptionHandler 函数中没有属性以及如何解决此限制? DataCloneError [重复] 【发布时间】:2019-12-05 06:16:21 【问题描述】:使用 AngularJs v1.5.7,我在尝试记录异常时遇到了一些麻烦。 问题似乎与异常的类型有关。 该对象在某种程度上不是具有属性的普通对象。 这是我迄今为止尝试过的代码示例以及每次尝试的结果。
MyApp.config(['$provide', function ($provide)
$provide.decorator('$exceptionHandler', ['$delegate', 'logsService', function ($delegate, logsService)
return function (exception, cause)
$delegate(exception, cause);
try
//Attempt #1 : throw because exception isn't an object.
logsService.addLog(exception);
//Attempt #2 : Log the hardcoded object with both properties
logsService.addLog(a:'Some test', b:'Ok');
//Attempt #3 : log an empty object because exception has no property
var log = ;
for (var property in exception)
if (object.hasOwnProperty(property))
log[property] = exception[property];
logsService.addLog(log);
//Attempt #4 : Log the message, but doesn't log all possible properties that exception could have.
logsService.addLog( message: exception.message);
catch (ignore)
;
]);
]);
注意:我无法更改 logsService
。
到目前为止,我在 google 上没有找到任何关于此的内容。
为什么exception
没有属性以及如何解决这个限制?
编辑:
我想我已经指出了更多的问题。异常对象可能不干净并且具有无法克隆的功能或其他东西。这会在日志服务中产生以下错误。
DataCloneError: 无法在 'IDBObjectStore' 上执行 'put'`
Source
Error 和 Function 对象不能被结构化克隆算法复制;尝试这样做会引发 DATA_CLONE_ERR 异常。
//Attempt #5 : log an empty object because exception has no property.
var cleanedException = JSON.parse(angular.toJson(exception));
logsService.addLog(cleanedException);
是在手表中检查异常时显示的内容。
【问题讨论】:
见AngularJS $exceptionHandler Service API Reference - Example。它显示了如何覆盖默认的$exceptionHandler
。默认实现只是委托给$log.error
,后者将其记录到浏览器控制台中。
@georgeawg 就像你说的那样,我已经尝试覆盖默认实现,但异常仍然没有属性,问题仍然完全相同。
@georgeawg 错误很好,我添加了检查员显示的图像。但我认为问题在于Error and Function objects cannot be duplicated by the structured clone algorithm; attempting to do so will throw a DATA_CLONE_ERR exception.
【参考方案1】:
这个问题是因为错误不能被克隆,正如here所说的那样,这很无聊。
Error 和 Function 对象不能被结构化克隆算法复制;尝试这样做会引发 DATA_CLONE_ERR 异常。
所以其他人遇到了相关问题Is it not possible to stringify an Error using JSON.stringify?,他们找到了使用Object.getOwnPropertyNames
的解决方法。 Object.getOwnPropertyNames
一直是我的选择,因为所有可能的属性都将被记录。
//Attempt #6: Log all properties
var cleanedException = JSON.parse(JSON.stringify(exception, Object.getOwnPropertyNames(exception)));
logsService.addLog(cleanedException);
【讨论】:
【参考方案2】:要将Error object 复制到纯javascript 对象:
e = new Error("Example");
plain = message: e.message, stack: e.stack ;
console.log(plain);
然后可以为 Web Worker 克隆它。
【讨论】:
谢谢,我本可以从一开始就这样做,但我没有这样做,因为我见过有更多属性的情况,而不仅仅是error
和 message
。我的代码不需要知道异常中的内容,它只需要记录其中的内容。以上是关于为啥异常在 $exceptionHandler 函数中没有属性以及如何解决此限制? DataCloneError [重复]的主要内容,如果未能解决你的问题,请参考以下文章
@ExceptionHandler和@ControllerAdvice统一处理异常
全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler
如果 ExceptionHandler 捕获到异常,则不会调用 DelegatingHandler
@ExceptionHandler 用于自定义 ResponseEntityExceptionHandler 中的 Spring 异常未调用类型异常