找回密码
 加入
搜索
查看: 13916|回复: 16

[原创] Autoit 调用COM对象出错处理

[复制链接]
发表于 2008-6-25 12:13:22 | 显示全部楼层 |阅读模式
代码写了不少,以前一直没有认真想过容错处理。直到代码应用到不同的工作环境的时候,出现了莫明其妙的错误才会想到这个问题,也许这就是所谓的半路出家的结果,没有系统的学过编程理论,汗。话题扯远了,下面说下AU3中调用WMI的出错处理。也就是在AU3编程调用COM对象的出错处理。

下面以AUTOIT3帮助的例子为例。

; ObjEvent example
; COM Error Handler example
$oIE=ObjCreate("InternetExplorer.Application.1")
; Create Internet Explorer application
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
; Initialize a COM error handler
$oIE.UnknownMethod  
; Deliberately call an undefined method
If @error then
  Msgbox (0,"AutoItCOM test","Test passed:" & _
            "We got an error number: " & @error)
Else
  Msgbox (0,"AutoItCOM test","Test failed!")
Endif
Exit
; This is my custom defined error handler
Func MyErrFunc()

Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !"&@CRLF&@CRLF & _
         "err.description is: " &@TAB&$oMyError.description&@CRLF& _
        "err.windescription:"  &@TAB&$oMyError.windescription&@CRLF& _
         "err.number is: "      &@TAB&hex($oMyError.number,8)&@CRLF& _
        "err.lastdllerror is: "&@TAB&$oMyError.lastdllerror&@CRLF& _
        "err.scriptline is: "  &@TAB&$oMyError.scriptline& @CRLF& _
         "err.source is: "      &@TAB&$oMyError.source&@CRLF& _
         "err.helpfile is: "    &@TAB&$oMyError.helpfile&@CRLF& _
         "err.helpcontext is: " &@TAB&$oMyError.helpcontext)
    Local $err = $oMyError.number
    If $err = 0 Then $err = -1
    SetError($err)  
    ; to check for after this function returns
Endfunc




AUTOIT 的帮助例子永远是那么的详细和经典,为JON喝彩。废话了。哈。继续:

上边的例子是先用ObjCreateI创建一个Internet Explorer中的应用对象,然后马上定义了处理这个对象的解发事件,即 ObjEvent("AutoIt.Error","MyErrFunc") ,"AutoIt.Error"为AU3中内置的错误处理关键字,"MyErrFunc"为自定义函数;上边的例子中的MyErrFunc函数列出了调用COM对象中的所有Err 对象,这样在AU3中就可以方便的调用出错处理了,再也不会说有对象出错,软件退出的现象了。下边再写一个以显示连接远程计算机获得错误信息的代码为例:


Global $MyError,$RemoteComputer,$RemoteUser,$RemotePass
Global $objlocator, $objWMIService, $objlocator, $error
$MyError = ObjEvent("AutoIt.Error","MyErrFunc") 
$RemoteComputer="netdisk"
$RemoteUser="admin"
$RemotePass="test"
$objlocator = ObjCreate("wbemscripting.swbemlocator")
$objWMIService = $objlocator.connectserver($RemoteComputer,  _
                 "root/cimv2", $RemoteUser, $RemotePass)
$error=MyErrFunc()
If @error Then MsgBox(16,"错误", & _
                         "错误行数是:"&$error[2]&"行"&@CRLF &@CRLF & _
                        "错误代码为:"&$error[1]&@CRLF &@CRLF & _
                        "错误信息是:"&$error[3]&@CRLF &@CRLF)
Func MyErrFunc()
Local $MyRet[4]
    $MyRet[0] = $MyError.number
    $MyRet[1] = Hex($MyRet[0], 8)
    $MyRet[2] = $MyError.scriptline 
    $MyRet[3] = $MyError.description
    ConsoleWrite("### COM Error ! " & _
                "Number: " & $MyRet[1] & _
                "  ScriptLine: " &$MyRet[2] & _
                "  Description:" & $MyRet[3] &@CRLF)
    SetError(1)
    Return $MyRet
Endfunc




上边代码详细的显示了出错的行数、出错信息,出错的代码,而出错信息和出错代码完全是系统返回的,可以直接上网查了,不用再担心不知道错误原因了!

如图所示:
1、连接远程计算机失败:

2、远程计算机用户名或者密码不对:



转贴请保留版权,文章出处:http://www.lunhui.net.cn/article.asp?id=12

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +45 贡献 +15 收起 理由
zps26 + 30 + 5
juyz + 15 + 10 精品文章

查看全部评分

发表于 2008-6-26 11:48:51 | 显示全部楼层
呵呵~三恨就是强!顶了!~~~~~~~~~~~~~~
发表于 2008-6-26 12:28:12 | 显示全部楼层
正为出错犯愁呢!
学习了!
发表于 2008-6-27 00:50:11 | 显示全部楼层
$objWMIService = $objlocator.connectserver($RemoteComputer, & _
                 "root/cimv2", $RemoteUser, $RemotePass)


提醒一下,对于换行续接,如果前一参数已经完整,不用加&,直接_就可以了。如下:

$objWMIService = $objlocator.connectserver($RemoteComputer, _
                 "root/cimv2", $RemoteUser, $RemotePass)

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
xrbenbeba + 10 + 5

查看全部评分

 楼主| 发表于 2008-6-27 02:59:57 | 显示全部楼层
失误。。。在发BLOG时因为版面太短,只要换行的都加了这个上去,忘记删了。
上边发的是从BLOG复制过来的,汗。这也给你发现了。终于有个认真看贴子的了。哈。
发表于 2008-6-28 11:47:25 | 显示全部楼层
如果在一个脚本中要正理多个对象的错误事件,可否使用同一个处理函数?
 楼主| 发表于 2008-6-28 17:55:25 | 显示全部楼层
理论上是可以的。。。实际情况你测试一下,不行再发贴。
发表于 2008-6-29 10:41:44 | 显示全部楼层
不错,不过有些错误代码不好处理啊。。
发表于 2008-11-18 21:28:18 | 显示全部楼层
正需要这个来研究!
发表于 2008-11-20 13:03:19 | 显示全部楼层
太好了,我近期用AU3调用ADO去读写SQL时,就是出现出错时直接报 -1 的错后自运退出,
有这个做参考太好了~
发表于 2009-2-22 11:37:54 | 显示全部楼层
如果发生两次错误呢?怎样办呀
发表于 2009-2-24 11:33:48 | 显示全部楼层
必须顶
发表于 2009-6-17 23:01:34 | 显示全部楼层
前段时间正好碰到这种问题,现在终于知道如何解决了,感激不尽!
发表于 2009-6-18 08:49:16 | 显示全部楼层
太强!顶了!~~~~~~~~~~~~~~
发表于 2009-6-20 23:49:54 | 显示全部楼层
学习了,最近老是IE莫名其妙错误,没按程序流程走
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:32 , Processed in 0.079461 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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