Common Lisp 重新启动到条件绑定

2024-03-19

我在空闲时间学习 Common Lisp,并对条件系统有疑问。

当我们在 common lisp 中处理错误时,我们在处理程序中指定错误类型来确定要处理哪个错误。在引发和处理错误之间,我可以进行一些重新启动(例如使用 restart-case),但我无法在重新启动中指定错误类型。

例如,假设我有一个函数,它接受一个字符串和一个流,将字符串发送到流并从流中读取响应并返回它。假设如果我的消息错误,我会从流中读取错误响应。我想引发一个错误并绑定一个重新启动,要求新消息,如下所示:

(defun process-message (stream raw-message)
  (let ((response (get-response stream raw-message)))
    (restart-case
        (when (response-error-p response)
          (error 'message-error :text response))
      (change-raw-message (msg)
        (process-message stream msg)))))

现在假设消息很复杂并且我得到了另一个函数send-command在更高级别,可以从某些参数创建消息并调用进程消息。我想再绑定一次重启recreate-command-message这将允许用户从参数发送新命令,如果'message-error获得。此重新启动可以放置在重新启动案例中process-message,但这并不完全正确,因为process-message不应该知道这样的高级功能send-command并且返回值可能不同。

但现在流错误(如EOF等)将被抛出recreate-command-message如果套接字失败recreate-command-message重启在某些超高级中会可用socket-error处理程序并且此重新启动将是无用的并且是惯用的错误。

这是一个程序设计问题吗?应该设计一个程序来避免此类问题,或者我只是找不到如何将重新启动绑定到错误类型,或者我不正确理解条件系统?

Thanks.


也许这有帮助:

(define-condition low-level-error (simple-error)
  ()
  (:report (lambda (c s)
             (format s "low level error."))))

(define-condition high-level-error (simple-error)
  ()
  (:report (lambda (c s)
             (format s "high level error."))))

(defun low-level (errorp)
  (restart-case
      (when errorp (error 'low-level-error))
    (go-on ()
      :report "go on from low-level"
      t)))

(defun high-level (high-level-error-p low-level-error-p)
  (restart-case
      (progn
        (when high-level-error-p (error 'high-level-error))
        (low-level low-level-error-p))
    (go-on ()
      :report "go on from high level"
      :test (lambda (c) (typep c 'high-level-error))
      t)))

尝试调用high-level具有不同的值(t or nil)获取其参数,并在调试器中检查相应的可用重新启动是否满足您的需要。仅当发出高级别错误信号时才会看到高级别重新启动,并且由于较高级别的重新启动保留在堆栈中,因此较低级别的函数不必知道要恢复的高级别方法。

对于您的特定用例,如果我理解正确的话,这意味着:建立您的recreate-command-message重新启动以重新调用process-message in send-command,并使其仅适用于高级错误。

正如您在阅读上面链接的 PCL 章节 Vsevolod 后可能知道的那样,实际处理这些错误,即决定调用哪个重新启动,是通过handler-bind and handler-case.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Common Lisp 重新启动到条件绑定 的相关文章

  • 如何更改 php 错误电子邮件的主题?

    我有以下内容 error log big error 1 my email address 消息发送后 主题行中会显示 PHP error log message 有人可以告诉我如何自定义消息主题吗 error log Error mess
  • 输入不是数字时输出错误。 C++

    我正在创建一个函数 它从用户的输入中获取一个数字并找到它的绝对值 如果用户输入数字以外的任何内容 我想让它返回错误 我该怎么做呢 我知道这对很多人来说可能是一个简单的问题 但我正在上第一堂 C 编程课 所以我知之甚少 任何帮助将不胜感激 如
  • 使用包阴影符号

    例如 我有这个包定义 它遮蔽了 COMMON LISP LISTEN defpackage shadows use common lisp shadow listen export listen 然后我想使用另一个包中的这个包 比如说 de
  • Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

    这是我的serializers py 我想为内置用户模型创建一个序列化器 from rest framework import serializers from django contrib auth models import User
  • REST API 错误消息是否应该国际化? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在设计 REST API 的错误时 遵循标准 HTTP 代码 4XX 和 5XX 并包含主体 XML JSON 似乎是一个很好的做法 简短的信息
  • 有没有一种简单的方法可以使用 Common Lisp 中的 Python 库?

    在编写 Common Lisp 代码时我真正怀念的一件事是访问 Python 库 包括标准库和第三方模块 CLPython 提供了 Python 功能的有限子集 这阻止了大多数库的使用 因此这对我来说并不是很有用 我希望能够从 Common
  • 避免 C 错误处理中的重复

    我经常编写最终成为长序列的代码 例如 int error error do something if error return error error do something else with some args if error re
  • 如何在 shell 函数中获得“set -e”的效果和用处?

    set e 或以 bin sh e 对于出现问题时自动轰炸非常有用 它使我不必对每个可能失败的命令进行错误检查 如何在函数内获得与此等效的内容 例如 我有以下脚本 该脚本在出现错误时立即退出 并显示错误退出状态 bin sh e echo
  • 从PHP7.4升级到PHP8,是否可以忽略某些错误

    我们有一个巨大的代码库 在访问未定义的变量或数组键时 我们忽略了 php7 的通知 例如 somethingThatMayNotExist REQUEST somethingThatMayNotExist PHP8 现在会抛出错误 我知道我
  • Scala 恢复或recoverWith

    我们公司正在用Scala开发一些系统 我们有一些疑问 我们正在讨论如何映射未来的异常 但我们不知道何时应该使用选项 1 或选项 2 val created Future 选项1 val a created recover case e da
  • Go 中的格式错误 - %s %v 或 %w

    s v and w可用于格式化 Go 中的错误 将它们转换为字符串 fmt Errorf 它们在 Go 自己的工具中的使用方式似乎有所不同 In cmd go internal get path go https github com go
  • Jena tdb 中的事务发生错误?

    我正在尝试将属性写入模型 然后查询它 我的代码的这一部分 String directory EMAILADDRESS create the dataset for the tdb store Dataset ds TDBFactory cr
  • 如何在 netsuite 中使用 suitescript 2.0 显示自定义错误消息而不使用堆栈跟踪

    我想使用 suitescript 2 0 版本向用户显示没有堆栈跟踪的自定义错误消息 在工作流程中 自定义错误消息在没有堆栈跟踪的情况下显示 但在套件脚本中 错误消息 与堆栈跟踪一起显示 堆栈跟踪错误 type error SuiteScr
  • 是否存在应明确跟踪或忽略的事件?

    在做研究解决问题的同时如何在处理程序之后自动重新引发异常 https stackoverflow com q 56084252 216356 开发了一个异常类 具有在处理后自动再次抛出自身的能力 受到ThreadAbortException
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • R:使用 RGDAL 和 RASTER 包时抛出错误

    给所有可能相关的人 这是源代码 GRA D1 lt raster files 1 Sets up an empty output raster GRA D1 lt writeStart GRA D1 filename GRA D1 tif
  • 如何处理 Primefaces 延迟加载中的错误?

    我无法让用户知道发生的异常PrimeFaces http primefaces org LazyDataModel load方法 我正在从数据库加载数据 当引发异常时 我不知道如何通知用户 我尝试添加FacesMessage to Face
  • Apache Flink - “keyBy”中的异常处理

    由于代码错误或缺乏验证 进入 Flink 作业的数据可能会触发异常 我的目标是提供一致的异常处理方式 我们的团队可以在 Flink 作业中使用这种方式 而不会导致生产中出现任何停机 重启策略似乎不适用于此处 因为 简单的重启无法解决问题 我
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • warnings() 在函数内不起作用?如何解决这个问题?

    op lt options warn 0 although doesn t work for any value of warn assign last warning NULL envir baseenv thisDoesntWork l

随机推荐

  • Json 字符串到地图的转换,

    我正在尝试编写嵌套 JsonObject 到映射转换的通用代码 我有一个示例 JSONObject 作为 glossary title example glossary GlossDiv title S GlossList GlossEnt
  • ASP.Net 中的图表助手显示日期时间

    在 asp net mvc 应用程序中 我需要创建一个简单的折线图 所以我尝试了图表助手 该图表是使用两个列表创建的 x 轴应显示日期时间 y 轴应显示每个时间的值 现在使用下面的代码可以正常工作 listOfDateTimes 包含日期时
  • 当应用程序通过 gradle run 启动时,java.util.scanner 抛出 NoSuchElementException

    我创建了一个简单的 java echo 应用程序 它接受用户的输入并将其显示给他们以演示问题 我可以使用 IntelliJ 的内部 运行 命令毫无问题地运行该应用程序 并且在执行由gradle build 但是 如果我尝试使用执行应用程序g
  • 哪些递归函数不能使用循环重写? [复制]

    这个问题在这里已经有答案了 据我所知 大多数递归函数都可以使用循环重写 有些可能比其他的更难 但大多数都可以重写 在什么条件下不可能使用循环重写递归函数 如果存在这种条件 当您递归地使用函数时 编译器会为您处理堆栈管理 这使得递归成为可能
  • UIViewController 在 vi​​ewWillAppear 和 viewDidAppear 之间调整自身大小?

    我的项目中有一个非常奇怪的错误 我有一个UIScrollView作为我的主要观点 在它里面 我有一个UIViewController not UITableViewController 其中有一个UITableView实例变量 以及一些杂项
  • Wordpress 中的登录用户列表?

    是否可以获取 WordPress 中登录用户的列表 是的 有一个插件 WP OnlineUsers 您可以在这里找到这个插件 http lesterchan net portfolio programming php http lester
  • cassandra 中的行何时被覆盖

    我的理解是 当插入具有相同主键的另一行时 行将被覆盖 例如 我有专栏 user id int item id int site id int 和我的PRIMARY KEY user id item id 如果我有下表 user id ite
  • 获取手机类型

    当手机使用 PHP 连接到 mobi 网站时 有没有办法获取手机的类型 您可以使用 PHP 阅读用户代理 这可能会给您提供线索 http Detectmobilebrowsers mobi http detectmobilebrowsers
  • 非法字符错误:'\u200b'

    我正在面向对象编程课程中为小行星游戏制作小行星场 但收到非法字符错误 u200b 该问题似乎发生在第 12 行 import java awt Point 和 public class Asteroid extends PolyBlob 之
  • 回到 Rails

    因此 在离开几年后 我决定重新使用 Ruby on Rails 来完成我的一些个人项目 我想知道什么是了解 Rails 新功能的最佳资源 自从 1 2 发布以来 我什至还没有真正接触过 Rails 哦 是的 TextMate 仍然是 Mac
  • 如何替换字符串中的奇怪模式?

    我正在用 SQL 创建一个临时过程 因为我有一个用 markdown 编写的表的值 因此它在 Web 浏览器中显示为呈现的 HTML Markdown 到 HTML 的转换 该列的字符串当前如下所示 Questions about gene
  • 如何修复“App Store 连接操作错误 ITMS-90771”

    我正在尝试将我的应用程序提交到 TestFlight 但我不断收到此错误 这就是我的info plist 我该如何解决 将其添加到您的 info plist 中 然后重新提交您的应用程序
  • 为什么“element.innerHTML=”是错误的代码?

    我被告知不要使用附加内容element innerHTML 像这样 var str div hello world div var elm document getElementById targetID elm innerHTML str
  • kafka AdminClient API等待节点分配超时

    我是卡夫卡的新手 正在尝试使用AdminClient用于管理在我的本地计算机上运行的 Kafka 服务器的 API 我的设置与中完全相同快速开始 http kafka apache org quickstartKafka 文档的部分 唯一的
  • 使用 NSArrayController 分段 NSTableView

    我正在尝试创建一个分段NSTableView using NSArrayController和可可绑定 我正在寻找类似的方法 例如NSFetchedResultsController在 iOS 中 您可以在其中设置部分键路径 我想做一些类似
  • 在 cakephp 中使用本地化

    如何本地化 cakePhp 中的字符串 我在在线文档方面没有取得任何成功 谢谢你的帮助 有几个步骤 首先 设置要使用的区域设置 创建一个或多个 po该语言的文件 将所有支持 l10n 的字符串包裹起来 or d 辅助方法 以下是我的一个项目
  • 自适应卡:如何创建 6 列的表格而不截断文本?

    我创建了一张自适应卡来显示为表格 但是 文本被截断了 就像Today I 代替Today In Count完整的文本 此自适应卡适用于 Microsoft Teams 自适应卡 schema http adaptivecards io sc
  • blockUI 与 ajax 的异步选项为 false

    我需要调用一个 javascript 函数来返回 ajax 调用的内容 为了达到这个结果 我在 ajax 调用中将 async 选项设置为 false function ajaxQuery var content ajax url blab
  • 使用 DbConnection 执行存储过程

    我需要在数据库上执行存储过程 这是我到目前为止所得到的有效方法 protected DbProviderFactory dbProviderFactory this dbProviderFactory DalFactory GetFacto
  • Common Lisp 重新启动到条件绑定

    我在空闲时间学习 Common Lisp 并对条件系统有疑问 当我们在 common lisp 中处理错误时 我们在处理程序中指定错误类型来确定要处理哪个错误 在引发和处理错误之间 我可以进行一些重新启动 例如使用 restart case