找回密码
 加入
搜索
查看: 2264|回复: 3

这种情况下(Mysql Object相关)如何得到指定的错误信息?

[复制链接]
发表于 2008-6-19 21:14:22 | 显示全部楼层 |阅读模式
这是Mysql.au3里的函数:
[au3]Func _MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer, $sDriver = "{MySQL ODBC 5.1 Driver}", $iPort=3306)
        Local $v = StringMid($sDriver, 2, StringLen($sDriver) - 2)
        Local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $val = RegRead($key, $v)
        If @error or $val = "" Then
                SetError(2)
                Return 0
        EndIf
        $ObjConn = ObjCreate("ADODB.Connection")
        $Objconn.open ("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";PORT="&$iPort)
        If @error Then
                SetError(1)
                Return 0
        Else
                Return $ObjConn
        EndIf
EndFunc   ;==>_MySQLConnect
[/au3]
[au3]
$sql = _MySQLConnect($db_user, $db_password, $db_name, $db_host)
If @Error = 2 Then MsgBox(0, "Error", "请安装 MySQL ODBC Driver!")
If @Error = 1 Then MsgBox(0, "Error", "连接数据库失败!")
[/au3]

在调用此函数时,如果系统没有安装MySQL ODBC Driver,SetError(2)起作用,并能返回指定的出错信息:"请安装 MySQL ODBC Driver!"
       
但是如果Mysql服务器没开(或其它原因不能连接),则SetError(1)不起作用了,不能返回指定的出错信息:"连接数据库失败!"

只有在“结果输出”里显示以下出错信息:
......
...\mysql.au3 (29) : ==> 请求动作失败(请求于对象).: 【在以上函数里是第9行】
$Objconn.open ("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";PORT="&$iPort) 
$Objconn.open ("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";PORT="&$iPort)^ ERROR
+>20:58:13 AutoIT3.exe 完成[status]:0
+>20:58:14 AutoIt3Wrapper 完成
......
运行编译后的程序,会提示:
AutoIt 错误
-------------------------
Line -1:
        错误:请求动作失败(请求于对象).
请问在这种情况下如何得到指定的错误信息?

注:如果Mysql服务器运行正常的话,此程序运行正常。

[ 本帖最后由 zeebit 于 2008-6-23 21:14 编辑 ]
 楼主| 发表于 2008-6-20 09:40:49 | 显示全部楼层
记得在PHP编程里,可以在函数前加个符号(好像是@),这样即使出错也不会退出。
不知道AutoIt里有没有这样的选项?
还有Debug好像不太会用,也没找到什么教程,不知道有没有这样的教程?
 楼主| 发表于 2008-6-20 10:13:49 | 显示全部楼层
这是帮助里的
某些函数通过返回值来指示函数执行的 成功/失败;有些则通过设置 @error flag (错误码/标志)的值来表示,还有些则同时使用这两种方式…
@error = 0 ;代表成功
Return = varies (变量),通常为了便于理解而以 非零 的返回值来表示一个成功的结果。

    If someUserFunc() then  ;...用于在调用某函数且成功通过时执行其他命令语句
    If Not someUserFunc() then  ;...与上相反

    $x = FileReadLine("C:\someFile.txt")
    If @error = -1 Then ;到文件尾

在调用某个函数的时候若该函数有设置 @error 标志则应优先考虑通过 @error 标志来判断函数的执行情况而不是利用返回值,if @error 语句可方便且清楚地让人看出在遇到各种不同错误时程序的相应应对策略,而返回值却通常是未定义的。



进入一个函数,@error总是为 0 .

当一个文件状态返回值 = none, AutoIt 总是会返回一个值来避免错误. 通常是返回 1 , 但是您不能依靠它来处理文件.
 楼主| 发表于 2008-6-21 22:11:32 | 显示全部楼层
自己顶!
有路过的吗
 楼主| 发表于 2008-6-23 08:38:23 | 显示全部楼层
还有路过的吗?
发表于 2008-6-23 09:16:20 | 显示全部楼层
试试
Func _MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer, $sDriver = "{MySQL ODBC 5.1 Driver}", $iPort = 3306)
        Local $v = StringMid($sDriver, 2, StringLen($sDriver) - 2)
        Local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $val = RegRead($key, $v)
        If @error Or $val = "" Then
                SetError(2)
                Return 0
        EndIf
        $ObjConn = ObjCreate("ADODB.Connection")
        If IsObj($ObjConn) Then
                $ObjConn.open("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";PORT=" & $iPort)
                Return $ObjConn
        Else
                SetError(1)
                Return 0
        EndIf
EndFunc   ;==>_MySQLConnect
 楼主| 发表于 2008-6-23 14:17:18 | 显示全部楼层
谢谢Pcbar,经过测试还是一样
$ObjConn.open之前都是正常的,就是在Open的时候截不到错误
发表于 2008-6-23 20:15:30 | 显示全部楼层
这个需要到ERR错误对象,可以完全返回系统提示的所有错误提示信息。
 楼主| 发表于 2008-6-23 20:55:03 | 显示全部楼层
好高深啊
谢谢三恨,在帮助里找到了
COM 错误句柄
 

Using COM without proper error handling can be very tricky. Especially when you are not familiar with the Objects in your script.

 

An AutoIt script will immediately stop execution when it detects a COM error.  This is the default and also the safest setting.  In this case you have to take measures in your script to prevent the error from happening.

 

Only if there is no way to prevent a COM error, you could install an "Error Handler" in which you take action after the error has happened. It is not a solution to make a buggy script work properly. Neither does it catch non-COM related script errors (e.g. declaration and syntax errors).

 

Error handling is implemented in the same way as a normal COM Event, using ObjEvent() and a user defined COM Event Function. The only difference is the usage of the fixed string "AutoIt.Error" as the name of the object.

 

An example:

 

$oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Install a custom error handler 

; Performing a deliberate failure here (object does not exist)
$oIE = ObjCreate("InternetExplorer.Application")
$oIE.visible = 1
$oIE.bogus 
if @error then Msgbox(0,"","the previous line got an error.")

Exit 


; This is my custom error handler 
Func MyErrFunc() 
   $HexNumber=hex($oMyError.number,8) 
   Msgbox(0,"","We intercepted a COM Error !" & @CRLF & _
                "Number is: " & $HexNumber & @CRLF & _
                "Windescription is: " & $oMyError.windescription ) 

   SetError(1) ; something to check for when this function returns 
Endfunc

 

One thing is special about the Error Event Handler, and that is the Object it returns.  This is an AutoIt Error Object that contains some useful properties and methods.  It's implementation is partly based on the "Err" Object in VB(script):
[ 本帖最后由 zeebit 于 2008-6-23 21:07 编辑 ]
发表于 2008-6-23 21:12:37 | 显示全部楼层
不错。正是这个。。。返回$oMyError.description即可提取到所有错误信息。。。

并且还有错误代码和代码出现错误行数,非常爽的说。。。
发表于 2010-3-17 12:30:38 | 显示全部楼层

评分

参与人数 1金钱 -10 贡献 -1 收起 理由
afan -10 -1 警告,禁止纯表情!

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-19 06:52 , Processed in 0.083830 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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