【问题标题】:scheme call/cc for handling errors用于处理错误的方案调用/cc
【发布时间】:2012-11-11 09:42:57
【问题描述】:

我有一个 Scheme 应用程序,它接受一些用户输入、计算并给出一些输出。我想通过启用某种错误处理和一种平稳退出的方式来使其更加健壮。调用当前延续似乎是填补这个空白的东西,但我不太确定如何去实现它。

截至目前,如果用户输入了一些无效的输入,程序将崩溃并退出。我只想将用户保留在应用程序中并给出错误消息。这是我的方法的概述,但我不确定在哪里实现它,以便如果发生通常会使系统崩溃的错误,只需给出错误并将它们保留在程序中。

  (define (handle_err)
    (call/cc
     (lambda (a)
    (display "exception handled: a"))))

我还想彻底退出程序。也就是说,不是崩溃退出,也不是休息。我希望用户输入“离开”,关闭程序并返回解释器。我的大纲看起来很像上面的,但它没有让用户离开程序,它只是让他回到输入提示。

感谢任何想法。

【问题讨论】:

  • 你使用的是什么 Scheme 实现?
  • R5RS 是 Scheme 的标准。你使用的是什么 R5RS 实现?这很重要,因为各种实现具有相互冲突的异常系统,并且针对您的问题的解决方案因这些实现而异。
  • 啊,我明白了。我正在使用 umb 方案,随 Linux 一起提供。还是...

标签: scheme r5rs


【解决方案1】:

是的,call/cc 可以处理这种控制转移。这里的一个问题是 call/cc 对应于这个例子中的“try/catch”,而不是“throw”。

不过,更大的问题是,当错误发生时,您在 r5rs 中没有任何好的方法来控制。

这实际上只是一个更大问题的症状,即各种不同的 Scheme 实现以不同的方式解决了这个问题。

就个人而言,我强烈建议您看看 Racket;它在许多版本的 Linux 上受支持,存在于许多标准发行版中,并且处理得非常好:

#lang racket

(with-handlers ([exn:fail?
                 (lambda (exn)
                   (display "oh noes! An exception occurred!"))])
  (try-something-dangerous))

(define (try-something-dangerous)
  (/ 1 0))

实际上,即使您想编写 r5rs 程序,我也会推荐 Racket;你可以开始你的程序

#lang r5rs

...获得完全的 r5rs 合规性。

【讨论】:

    【解决方案2】:

    好吧,你看看这个方法

    (define-syntax try
      (syntax-rules ()
            ((_ handler throw chunk)
             (call/cc (lambda (catch)
                    (let ((throw (lambda (exc) (catch (handler exc)))))
                      chunk))))))
    (define (div p q)
      (try 
        ;; Error processing
        (lambda (error) (printf "Error: ~s~n" error) error)
    
        ;; Error my be thrown with keyword "throw"
        throw
    
        ;;Actual code to run
         (if (= q 0)
        ;; Oh noes, error!
            (throw "Division by zero")
        ;; All ok, do the work
         (/ p q))))
    
    (printf "1/0: ~s~n" (div 1 0))
    (printf "1/2: ~s~n" (div 1 2))
    

    “throw”用于捕获 throw 函数的名称(这是出于卫生考虑)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多