为啥异常在 $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 克隆它。

【讨论】:

谢谢,我本可以从一开始就这样做,但我没有这样做,因为我见过有更多属性的情况,而不仅仅是 errormessage。我的代码不需要知道异常中的内容,它只需要记录其中的内容。

以上是关于为啥异常在 $exceptionHandler 函数中没有属性以及如何解决此限制? DataCloneError [重复]的主要内容,如果未能解决你的问题,请参考以下文章

统一异常处理@ExceptionHandler

用@ExceptionHandler 来进行异常处理

@ExceptionHandler和@ControllerAdvice统一处理异常

全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler

如果 ExceptionHandler 捕获到异常,则不会调用 DelegatingHandler

@ExceptionHandler 用于自定义 ResponseEntityExceptionHandler 中的 Spring 异常未调用类型异常