HOWTO:捕获ActiveX Script Host中的运行时错误

时间:2022-03-30 07:32:20

翻译自:Knowledge Base:Q232394

摘要:
      如同所有的程序,在ActiveX Script Host中运行的脚本,能抛出两种类型的错误:编译时错误、运行时错误。由Micosoft提供的ActiveX Script Engines(VBScript/JScript),  在早期的实现中对这两种错误的处理没有区别,均由IActiveScriptSite::OnScriptError()来处理。随着更多Script engines新版本的出现,运行时错误与编译时错误之间的区别也产生了。编译时错误,例如语法错误,仍然报告给ActiveX Script Host,通过IActiveScriptSite::OnScriptError()来处理。然而,运行时错误,例如传入无效的参数,不直接报告给OnScriptError(),而是报告给另一个方法IActiveScriptSiteDebug::OnScriptErrorDebug().
      这篇文章将描述如何修改ActiveX Script Host,以便捕获由脚本抛出的运行时错误。

详细内容:

      在这里,假设你已经编写了一个ActiveX Script Host。有关更多的信息请参见本文参考区列出的文章。
      在脚本引擎的最新发行版中,当一个运行时错误发生时,IActiveScriptSiteDebug::OnScriptErrorDebug将被调用。IActiveScriptSiteDebug接口提供Script Host一个机会,在debugger被调出之前参与调试工作。为了在运行时错误发生时Script Host能得到通知,需要IActiveScriptSiteDebug接口的最小实现。
      当IActiveScript::SetScriptSite方法被调用时,Script Engine将通过host的IActiveScriptSite指针查询IActiveScriptSiteDebug接口。如果失败,Script engine将尝试联系自己的脚本调试器。然而,如果查询成功,Script engine将调用IActiveScriptSiteDebug::GetApplication()为本次会话建立调试工具。如果IActiveScriptSiteDebug::GetApplication()失败,Script engine将断定在本机调试不可用,从而返回到IActiveScriptSite::OnScriptError()进行所有的错误处理。
    
      下面是IActiveScriptSiteDebug接口的最小实现:

   STDMETHOD GetDocumentContextFromPosition(
      DWORD dwSourceContext,
      ULONG uCharacterOffset,
      ULONG uNumChars,
      IDebugDocumentContext **ppsc) {return E_NOTIMPL;}

   STDMETHOD GetApplication( IDebugApplication **ppda ) {return E_NOTIMPL;}

   STDMETHOD GetRootApplicationNode( IDebugApplicationNode **ppdanRoot) {return E_NOTIMPL;}
  
   STDMETHOD OnScriptErrorDebug(
      IActiveScriptErrorDebug *pErrorDebug,
      BOOL *pfEnterDebugger,
      BOOL *pfCallOnScriptErrorWhenContinuing) {return E_NOTIMPL;}

       当然,Script Host可以选择IActiveScriptSiteDebug接口的一个较复杂的实现。有关IActiveScriptSiteDebug接口和实现的文章,请参见:
       http://msdn.microsoft.com/scripting ,并选择Hosing Information/Documentation/Windows Script Debugging。Smart Host专区描述如何实现IActiveScriptSiteDebug接口。

      参考:
      有关生成Active Script Host的更多信息,请参见下面列出的Microsoft Knowledge Base文章:
            Q223139 HOWTO: Add Support for Hosting VBScript to an ATL Application
            Q183698 SAMPLE: AXSH.exe Demonstrates Implementing ActiveX Script Hosts
            Q168214 SAMPLE: MFCAxs.exe Implements an ActiveX Script Host Using MFC 
             Q223389 FILE: Scriptng.exe Contains the Files Necessary for Implementing ActiveX Script Hosts and Engines