Debugging 错误时调试与信号时调试(特别是在json.el中)

Debugging 错误时调试与信号时调试(特别是在json.el中),debugging,emacs,elisp,Debugging,Emacs,Elisp,我的期望是在出错时进行调试,以捕获大多数异常事件,并向我展示出错的地方。然而,这不是使用信号而不是错误的情况 关于使用debug on signal的注意事项和我对它的简短实验基本上证实了这一点——到处都是信号,所以我只能捕捉json-*信号,从中获得有用的信息。但我连这个都做不到 我正要为json.el提交一份bug报告,但我觉得我可能遗漏了一些东西。json.el为什么更喜欢信号而不是错误,有没有一个好的、确定的理由 重新编程的步骤: (require 'json) (setq debug-

我的期望是在出错时进行调试,以捕获大多数异常事件,并向我展示出错的地方。然而,这不是使用信号而不是错误的情况

关于使用debug on signal的注意事项和我对它的简短实验基本上证实了这一点——到处都是信号,所以我只能捕捉json-*信号,从中获得有用的信息。但我连这个都做不到

我正要为json.el提交一份bug报告,但我觉得我可能遗漏了一些东西。json.el为什么更喜欢信号而不是错误,有没有一个好的、确定的理由

重新编程的步骤:

(require 'json)
(setq debug-on-error t
      debug-on-signal t)  ; "json" ; '("json") ;; Still nothing
(json-read-from-string "")
更现实地说,当您将输出从某物传递到json read或其方便的包装器(json read from string、json read file、json read object等)时,您会遇到一个实际的问题,它不包含您期望的内容

即使将debug on signal设置为t,其结果仍然是*Messages*缓冲区中的以下文本,而不是其他内容:


没有关于错误来源的任何指示,或任何东西。在具有类似问题的实际代码中,我看到的是:解析期间是否为文件结尾。

事实上,debug ignore errors的默认值包括文件结尾,因此您必须删除该值才能调试此特定问题

(delete 'end-of-file debug-ignored-errors)
或者更现实一些

(let (debug-ignored-errors)
   (json-something))
在json调用期间临时覆盖debug ignored errors的值

。。。然后你们根本不需要调试信号


因此,我认为使用信号而不是错误导致问题行为的推测是错误的。

我仍然希望有一个答案能够澄清何时应该使用信号而不是错误。错误和用户错误只是信号的方便包装,每个都有一个特定的错误符号集。就像其他语言中的异常处理一样,为特定条件指定特定名称非常有用,这样您就可以显式地为这些条件设置条件。我看到社区对这个问题的讨论让我回复了一条5年前的评论:这可能是完全多余的!C-HIG Elisperor符号包含了大部分细节。如果进行测试,请注意,应该使用define error来声明任何此类符号,因为如果条件case缺少error conditions属性,则会忽略处理程序条件符号。我最初链接到旧文档,其中有更强大的语言:警告:此变量是强函数!现在也见