2

Rebol的错误!type 作为一个对象返回,您可以从中检查和提取属性。

>> 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对象并找到那些字符串,然后自己尝试将它们组合在一起。但是二进制文件中没有一些官方功能可以做到这一点吗?

4

3 回答 3

3

在 Rebol 3 中,您可以简单地使用FORM来转换错误!将对象放入其漂亮的印刷表示中:

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

>> form err
== {** Math error: attempt to divide by zero
** Where: / try
** Near: / 0
}
于 2013-06-24T07:08:31.103 回答
1

对于 Rebol2,您可以使用以下函数(我从 Doc 或 Gabriele 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
于 2013-06-25T07:21:39.380 回答
0

您可以像这样创建自己的错误,其中错误对象上的 'do 武装错误。

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
]
于 2013-06-24T07:18:57.753 回答