2013-06-24 3 views
2

Ошибка Rebol! тип возвращается как объект, который вы можете проверить и извлечь из него.Как форматировать ошибки Rebol как строки?

>> result: try [1/0] 
** Math error: attempt to divide by zero 
** Where:/try 
** Near:/0 

>> probe result 
make error! [ 
    code: 400 
    type: 'Math 
    id: 'zero-divide 
    arg1: none 
    arg2: none 
    arg3: none 
    near: [/ 0] 
    where: [/ try] 
] 
... 

Обратите внимание, что, когда эта ошибка всплывает на консоль и последнее значение цепочки оценки, она превращает его в строку, и представляет его пользователю. например «Ошибка математики: попытка деления на ноль».

Как создать эту строку в моем собственном коде? Я знаю, что могу выкопать объект system и найти эти строки и попытаться собрать его вместе. Но разве нет какой-то официальной функции, которая отправляется в двоичном коде, чтобы это сделать?

ответ

3

В Rebol 3, вы можете просто использовать FORM, чтобы преобразовать ошибку! объект в его довольно-печатное представление:

>> err: try [1/0] 
... 

>> form err 
== {** Math error: attempt to divide by zero 
** Where:/try 
** Near:/0 
} 
+0

Hrm. Ну, это было легко. – HostileFork

0

Вы можете создавать свои собственные ошибки, как это, где «делают на объект ошибки гербе ошибка.

make-sl4a-error: func [ 
    message 
][ 
    do make error! [ 
     type: 'Access 
     id: 'Protocol 
     arg1: message 
    ] 
] 

В Rebol 2, вам необходимо обезвредить ошибку перед формированием

>> err: try [ 1/0 ] 
>> print mold disarm err 

make object! [ 
    code: 400 
    type: 'math 
    id: 'zero-divide 
    arg1: none 
    arg2: none 
    arg3: none 
    near: [1/0] 
    where: none 
] 
+0

Приятно познакомиться ... но это не то, что я попросил !! (И нет никаких ошибок в Rebol3 AFAIK) – HostileFork

+0

Ну, так как вы не приняли ответ Эрла в то время, я решил, что вы должны просить что-то другое, кроме формы или плесени на ошибке! Кстати, сделайте ошибку! Просто создает объект ошибки. Он должен быть вооружен перед использованием. –

1

Для Rebol2 вы можете использовать следующую функцию (я взял его от Doc или Габриэле IIRC)

form-error: func [ 
    "Forms an error message" 
    errobj [object!] "Disarmed error" 
    /all "Use the same format as the REBOL console" 
    /local errtype text where 
][ 
    errtype: system/error/(errobj/type) 
    text: errtype/(errobj/id) 
    if block? text [text: reform bind text errobj] 
    either all [ 
     where: get in errobj 'where 
     rejoin [ 
      "** " errtype/type ": " text newline 
      either :where [join "** Where: " [mold :where newline]] [""] 
      either errobj/near [join "** Near: " [mold/only errobj/near newline]] [""] 
     ] 
    ] [text] 
] 

необходимо устранить вашу ошибку:

>> print form-error/all disarm try [1/0] 
** Math Error: Attempt to divide by zero 
** Near: 1/0 
+0

Ну, это глоток. Хороший аргумент для метода Rebol3! – HostileFork