找回密码
 加入
搜索
查看: 2314|回复: 9

[AU3基础] [已解决]关于方法SetError()和@error 用法的理解问题。

  [复制链接]
发表于 2013-5-9 11:06:55 | 显示全部楼层 |阅读模式
本帖最后由 wiley_wang 于 2013-6-5 15:45 编辑

对于SetError和@error的用法有些地方理解不了,希望各位帮忙解答解答!!!
这是我写的一个例子:
Test1()
Func Test1()
        Local $result = 1
        test(1)
        $result += @error
        ConsoleWrite("Test::::::::::::::::::" & $result & @CRLF)
        test(0)
        $result += @error
        ConsoleWrite("Test::::::::::::::::::" & $result & @CRLF)
        test(1)
        $result += @error
        ConsoleWrite("Test::::::::::::::::::" & $result & @CRLF)
        test(0)
        $result += @error
        ConsoleWrite("Test::::::::::::::::::" & $result & @CRLF)
EndFunc
Func test($x)
        If $x = 1 Then
                SetError(1, 3, 0)
                ; 根据其他测试用例,可以了解到SetError中第三个参数是整个SetError这个function的返回值、
                ; 1. 我想问问,这个返回值是可以随便写的么,有没有什么特定的值?
                ; 2. 第二个参数代表什么,完全没理解,希望各位解答一下,有没有什么方法使用这个参数的结果?
                Return @error
        Else
                Return @error
        EndIf
EndFunc
@error 据我了解是返回关于最近的function所设置的@error的值,这个特性有没有办法改变 呢?
发表于 2013-5-9 12:02:53 | 显示全部楼层
据我了解  我都不知楼主想表达啥
发表于 2013-5-9 12:27:35 | 显示全部楼层
“Return @error” 这样写是错误的。这样返回的并非 @error ,而是将  @error 值当成了返回值。
如果你只需要@error,不需要返回值,就不要 Return xxx,或者 Return SetError(x)

如果你既需要@error,也需要 @extended 扩展值,可以 SetError(x, xx)

如果你既需要@error,也需要 @extended 扩展值,还需要返回值,那么可以 SetError(x, xx, xxx)

这些值具体怎么用,可以依据自己的需要或方便使用来定,可以多看看 UDF 写法

评分

参与人数 1金钱 +10 收起 理由
wiley_wang + 10 谢谢帮忙

查看全部评分

发表于 2013-5-9 12:29:26 | 显示全部楼层
看帮助~不是说的很明白了么
下面是帮助中的例子
SetError:设置宏 @error 的值.
SetError ( 错误码 [, 扩展值 [, 返回值]] )
Local $iResult = myDiv(5, 0)
If @error Then
    MsgBox(4096,"错误", "除数为 0")
Else
    MsgBox(4096, "结果", $iResult)
EndIf
Exit

Func myDiv($iDividend, $iDivisor)
    If $iDividend = 0 And $iDivisor = 0 Then
        SetError(2) ;表达式为 0/0
    ElseIf $iDivisor = 0 Then
        SetError(1) ;除数为 0
    EndIf
    Return $iDividend / $iDivisor
EndFunc   ;==>myDiv
 楼主| 发表于 2013-5-9 13:04:17 | 显示全部楼层
回复 3# afan

谢谢!
 楼主| 发表于 2013-5-9 13:05:10 | 显示全部楼层
回复 4# haijie1223

看了没看明白才来问问嘛......
 楼主| 发表于 2013-5-9 13:07:20 | 显示全部楼层
回复 3# afan

只是恰巧碰到了这个,以后会抽空多看看UDF,谢谢指教
发表于 2013-5-9 15:49:27 | 显示全部楼层
不是很理解异常是什么处理的 来看看
发表于 2013-5-9 16:42:08 | 显示全部楼层
回复 6# wiley_wang


    @error 的值是用SetError来设置的,这样说能明白吗?你也可以认为@error是一个“标志”开关,针对处理结果不同,设置“标志”为不同的值,所以根据“标志”的返回值就知道程序得到了什么样的结果。
例如:你想利用一个函数来判断一个数是正数还是负数,可以利用设置@error的值来判断。
Dim $a = 0, $b = 1, $c = -1

zf($c)
If @error = 1 Then MsgBox(0, "", "变量为0")
If @error = 2 Then MsgBox(0, "", "变量为正数")
If @error = 3 Then MsgBox(0, "", "变量为负数")



Func zf($num)
        If $num = 0 Then SetError(1)
        If $num > 0 Then SetError(2)
        If $num < 0 Then SetError(3)
EndFunc   ;==>zf
发表于 2013-5-9 18:18:48 | 显示全部楼层
我的理解:
@error 反映调用一个函数时该函数的执行情况. 一般我们在成功得到结果时,设为0,失败时设为1等. 当然不一定这样,你自己根据自己的喜好或要求而设定.
SetError 这是内置函数, 让我们得以在自定义函数内设置它的@error. 如果不用它, 那么所有的自定义函数的@error值都被默认地设为0.

借用4楼代码进一步说明吧;
Local $iResult = myDiv(5, 0)
If @error Then
        If @extended = 1 Then 
      MsgBox(4096,"输入错误", "除数为0")
    ElseIf @extended = 2 Then
          MsgBox(4096,"输入错误", "除数和被除数均为0")
    Else
          MsgBox(4096,"错误", "发生了未知错误")
        EndIf
Else
    MsgBox(4096, "结果", $iResult)
EndIf

Func myDiv($iDividend, $iDivisor)
    If $iDividend = 0 And $iDivisor = 0 Then
        Return SetError(1, 2) ;表达式为 0/0,设置@error 及其扩展值
    ElseIf $iDivisor = 0 Then
        Return SetError(1, 1) ;除数为 0,;同上,设置@error 及其扩展值,
                ;但扩展值有所不同,以示这是另一个错误.                
        Else
                Return SetError(0, 0, $iDividend / $iDivisor) ; 返回正确结果
    EndIf
    Return SetError(1, 3) ;未知错误
EndFunc
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-29 05:33 , Processed in 0.108709 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表