Как PLTScheme Фиксирует ошибки?

Решение

После загрузки источника MVC я все еще не мог видеть, почему это не будет работать, таким образом, я предположил, что это должно быть что-то, чтобы сделать с типом, который я пытался связать. Конечно же, причем значения являются членскими переменными, в противоположность свойствам, был преступник. Это вызвано тем, что образцовый редактор связей использует отражение для установки свойств, которые это не находило через вызов к TypeDescriptor.GetProperties(Type).

Обновление класса значения к этому решило его (после того, как часы удара препятствуют стене, которую я должен добавить!!):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}
5
задан Eli Barzilay 8 June 2010 в 21:14
поделиться

1 ответ

В схеме PLT процедура error вызывает исключение exn: fail , которое содержит строку ошибки. Для всех определений нет "неявной ловушки". Посмотрите на следующий пример:

;; test.ss
(define (a d)
  (printf "~a~n" (/ 10 d)))

(a 0) ;; The interpreter will exit here.     
(printf "OK~n")

Выполните указанный выше сценарий из командной строки, и вы увидите, что интерпретатор существует после вывода чего-то вроде

/: division by zero

 === context ===
/home/user/test.ss:1:0: a

. Если исключение не обрабатывается в пользовательской программе, оно распространяется до основного интерпретатора где обработчик по умолчанию имеет дело с этим, то есть вывести исключение и выйти. Другими словами, интерпретатор просто говорит: «Возникло исключение, и я не знаю, как с ним бороться, поэтому я ухожу». Это не сильно отличается от того, как JVM или другие виртуальные машины обрабатывают исключения.

Чтобы узнать больше о механизме обработки исключений PLT Scheme, см. пожалуйста, прочтите о with-handlers и dynamic-wind в MzScheme Language Manual . Используя их, вы даже можете эмулировать блок Java try-catch-finally.

(define (d a b)
  (try
   (printf "~a~n" (/ a b))
   (catch (lambda (ex)
            (printf "Error: ~a" ex)))
   (finally 
    (if (> b -2) 
      (d a (sub1 b))))))

Вот расширение синтаксиса, которое сделало это возможным:

;; try-catch-finally on top of with-handlers and dynamic-wind.

(define-syntax try
  (syntax-rules (catch finally)
    ((_ try-body ... (catch catch-proc))
     (with-handlers (((lambda (ex) #t)
              (lambda (ex) 
            (catch-proc ex))))
            (begin
              try-body ...)))
    ((_ try-body ... (catch catch-proc) (finally fin-body ...))
     (dynamic-wind
     (lambda () ())

     (lambda ()
       (with-handlers (((lambda (ex) #t)
                (lambda (ex) 
                  (catch-proc ex))))
              (begin
                try-body ...)))

     (lambda () fin-body ...)))
    ((_ try-body ... (finally fin-body ...))
     (dynamic-wind
     (lambda () ())

     (lambda () try-body ...)

     (lambda () fin-body ...)))))
6
ответ дан 14 December 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: