2012-10-07 34 views
1

中提取上下文信息等效于__LINE__,__FILE __等,我想知道如何在vbscript中以编程方式获取行的行号,或者在__LINE__之类的代码点或更理想的位置一种获取当前函数被称为python的堆栈模块的行号的方法,这样我就可以编写一个可重用的调试函数(以及代码所在的文件),而且我不想知道如何打开行数字在我的编辑器中。如何在VBSCRIPT

另外,我想现在可以提取,如调用函数,变量类型为字符串的任何类似的有用信息等

+0

这将涉及创建一个脚本调试器,如此MSDN中所述:http://msdn.microsoft.com/en-us/library/z537xb90(v=vs.94).aspx – Jay

+0

也许在调试中使用标题具有误导性,我正在谈论更多printf调试/日志记录功能,以便人们能够快速找到发生错误的详细信息。 –

回答

1

不幸的是,它不能像Ruby和Python一样工作。我制定的下一个最好的事情是在任何可能出错的地方打一个错误处理函数。每次我在我的编辑器中执行一个宏时(我使用textpad,\ i在正则表达式中自动编号),该函数的参数中的数字都会被调整。如果你的编辑器不支持这个,你可以写一个脚本来做到这一点。所以当发生错误时,它会记录错误处理函数被调用的编号,您可以通过查找#编号#轻松找到它。

这对于asp和vbs都可用,但对于vbs有一个更简单的方法。 某些编辑器(如textpad或sublimle文本)可让您执行vbs脚本,在标签中显示输出结果,并且如果产生错误,则可使用errormessage双击该行,从而在该行打开脚本。这也是通过正则表达式来完成的。让我知道如果你需要一个用于文本板。

on error resume next 
'initialize constants DEBUGLEVEL and LOGFILE 
'initialize strHostName 

'some code 
oConn.execute(sql) 

if not LogError("#1#") then 
    'do the things if successfull, otherwise log error with number 
end if 

'again some code 
if not LogError("#2#") then 
    'do the things if successfull, otherwise log error with number 
end if 

'the debug and log functions 
function LogError(errornumber) 
    'LogError\(\"#[0-9]+#\"\) replace by LogError("#\i#") 
    if err.number <> 0 then 
    call debug("<name of script>/Logerror","","","Errornumber:" _ 
     & errornumber & " " & err.number & " " & err.description & " " _ 
     & err.source) 
    LogError = True 
    err.clear 
    errors = errors+1 
    else 
    LogError = False 
    end if 
end function 

function Debug (pagina, lijn, varnaam, varinhoud) 
    if DEBUGLEVEL > 0 then 
    const forReading = 1, forWriting = 2, forAppending = 8, CreateFile = True 
    dim fs,f, var, strHostName 
    set fs=CreateObject("Scripting.FileSystemObject") 
    strHostName = fs.GetFileName(WScript.FullName) 
    if fs.FileExists(LOGFILE) then 
     set f=fs.OpenTextFile(LOGFILE, forAppending) 
    else 
     set f=fs.OpenTextFile(LOGFILE, forWriting,true) 
    end if 
    var = now & " " & pagina & ":" & lijn & ":" & varnaam & ":" & varinhoud 
    f.WriteLine var 
    if LCase(strHostName) = "cscript.exe" then 'debugging 
     if DEBUGLEVEL > 1 then 
     wscript.echo var 
     end if 
    end if 
    f.Close 
    set f=Nothing 
    set fs=Nothing 
    end if 
    debug = true 
end function 
1

VBScript不公开这些信息,所以你不能访问它从脚本内部以编程方式(edge cases notwithstanding)。你将需要一个debugger来提取这种信息。或者你可以让另一个脚本解释第一个脚本并跟踪行号(like this)。不过,我不会推荐后者用于任何类型的生产环境。

0

只要它发生在函数之外,以下工作。

在脚本开始时,自动错误处理将被关闭On Error Resume Next,以便脚本不会在您执行任何操作前退出。但是,您可以使用On Error GoTo 0重新打开错误处理并自己提出异常。除了您的任何调试消息之外,它还会输出行号。

例如:

On Error Resume Next 
server = WScript.Arguments(0) 
If Err.Number <> 0 Then 
    WScript.Echo("Need to pass in an argument!") 
    On Error GoTo 0 
    Err.Raise(1) 
End if 

如果你运行这个不带任何参数,你会得到以下输出:

Need to pass in an argument! 
C:\script.vbs(6, 5) Microsoft VBScript runtime error: Unknown runtime error 

“6”指的是异常发生的行号。

通过这种方式,您可以打印自定义输出,并且还可以知道错误发生在哪一行。