异常和错误代码

From Apache OpenOffice Wiki
Jump to: navigation, search



UNO 接口函数通过抛出异常来指出错误。Automation 对象提供一种不同的错误机制。首先, IDispatch 接口描述在某些情况下返回的许多错误代码 (HRESULT)。其次,Invoke 函数接受一个参数,对象可以使用此参数提供描述性错误信息。参数是一种类型为 EXCEPINFO 的结构,桥用它来传达调用 UNO 接口函数后抛出的异常。如果 UNO 方法抛出异常,桥会使用以下值填充 EXCEPINFO::

 EXCEPINFO::wCode = 1001
 
 EXCEPINFO::bstrSource = "[automation bridge]"
 
 EXCEPINFO::bstrDescription = type name of the exceptions + the message of the exception (com::sun::star::uno::Exception::message )

并且返回的错误代码将为 DISP_E_EXCEPTION.


由于 automation 桥处理 Invoke 调用并且最终调用相应的 UNO 方法,因此,可以存在其他不是由 UNO 方法本身引起的错误。下表说明了这些错误及其原因。

HRESULT 原因
DISP_E_EXCEPTION
  • UNO 接口函数或属性访问函数抛出异常,并且调用程序没有提供 EXCEPINFO 参数。
  • 桥错误。当客户机调用 Bridge_GetValueObject 时,无法创建 ValueObject
  • 桥错误。当客户机调用 Bridge_GetStruct时,无法创建 struct。
  • 桥错误。当客户机调用 Bridge_CreateType 时,无法为 UNO 类型创建包装程序。
  • 桥错误。Automation 对象包含一个不支持 XInvocation 接口的 UNO 对象。可能是 com.sun.star.script.Invocation 服务失败。
  • JScript 中 Array 对象作为 inout 参数传递,并且桥无法获取属性 “0”。
  • 由于某种原因,转换 VARIANTARG(DISPPARAMS 结构)失败。
  • 参数数目与 UNO 类型信息提供的数目不一致(仅当 DISPPARAMS 包含 VT_DISPATCH 时)。这是一个错误。应该返回 DISP_E_BADPARAMCOUNT
DISP_E_NONAMEDARGS
  • 调用程序提供“已命名参数”来调用 UNO 函数。
DISP_E_BADVARTYPE
  • 转换 VARIANTARG 失败。
  • 桥错误:调用程序提供一个 ValueObject,而且尝试获取值失败。这可能是一个错误。应该返回 DISP_E_EXCEPTION
  • 根据类型信息,不存在具有当前名称的成员。这是一个错误。应该返回 ,code>DISP_E_MEMBERNOTFOUND</code>。
  • Bridge_CreateType 中的参数不是字符串或者无法转换成字符串。
DISP_E_BADPARAMCOUNT
  • 给属性指定的是一个值,而调用程序提供空参数或多个参数。
  • 调用程序没有提供 UNO 接口函数所需的参数数目。
  • 当参数数目不是 1 时,调用 Bridge_CreateType
DISP_E_MEMBERNOTFOUND
  • 调用 Invoke 使用的 DISPID 不是由 GetIDsOfName 返回的值。
  • 不存在当前调用 Invoke 时所用的接口函数(以及属性访问函数)。
DISP_E_TYPEMISMATCH 被调用的程序提供的参数类型不正确。
DISP_E_OVERFLOW 无法将一个参数强制转换成所需的类型。内部调用 XInvocation::invoke 导致抛出 CannotConvertException。字段 reason 具有值 OUT_OF_RANGE ,这表明给定值与目标类型的范围不匹配。
E_UNEXPECTED [2] 执行 XInvocation::invokecom.sun.star.script.CannotConvertException 的结果: FailReason::UNKNOWN。内部调用 XInvocation::invoke 导致抛出 com.sun.star.script.CannotConvertException。字段 reason 具有值 UNKNOWN,这表示某种未知错误状态。
E_POINTER 调用了 Bridge_GetValueObjectBridge_GetStruct,但没有提供返回值的参数。
S_OK 正确。


IDispatch::GetIDsOfNames: 的返回值:

HRESULT 原因
E_POINTER 调用程序没有提供接收 DISPID 的参数。
DISP_E_UNKNOWNNAME 不存在给定名称的函数或属性。
S_OK 正确。


函数 IDispatch::GetTypeInfoGetTypeInfoCount 返回 E_NOTIMPL


从 UNO 调用 Automation 对象 时,以下 HRESULT 值将被转换成异常。请注意,已经确定 XInvocation::invoke() 的函数允许抛出的异常。


XInvocation::invoke() 抛出的异常及其对应的 HRESULT:

HRESULT Exception
DISP_E_BADPARAMCOUNT com.sun.star.lang.IllegalArgumentException
DISP_E_BADVARTYPE com.sun.star.uno.RuntimeException
DISP_E_EXCEPTION com.sun.star.reflection.InvocationTargetException
DISP_E_MEMBERNOTFOUND com.sun.star.lang.IllegalArgumentException
DISP_E_NONAMEDARGS com.sun.star.lang.IllegalArgumentException
DISP_E_OVERFLOW com.sun.star.script.CannotConvertException, reason= FailReason::OUT_OF_RANGE
DISP_E_PARAMNOTFOUND com.sun.star.lang.IllegalArgumentException
DISP_E_TYPEMISMATCH com.sun.star.script.CannotConvertException, reason= FailReason::UNKNOWN
DISP_E_UNKNOWNINTERFACE com.sun.star.uno.RuntimeException
DISP_E_UNKNOWNLCID com.sun.star.uno.RuntimeException
DISP_E_PARAMNOTOPTIONAL com.sun.star.script.CannotConvertException, reason= FailReason::NO_DEFAULT_AVAILABLE


XInvocation::invoke() 抛出的异常与 invoke() 相同:

HRESULT Exception
DISP_E_BADPARAMCOUNT com.sun.star.uno.RuntimeException
DISP_E_MEMBERNOTFOUND com.sun.star.beans.UnknownPropertyException
DISP_E_NONAMEDARGS com.sun.star.uno.RuntimeException


除了以下异常,XInvocation::getValue() 抛出的异常与 invoke() 相同:

HRESULT Exception
DISP_E_BADPARAMCOUNT com.sun.star.uno.RuntimeException
DISP_E_EXCEPTION com.sun.star.uno.RuntimeException
DISP_E_MEMBERNOTFOUND com.sun.star.beans.UnknownPropertyException
DISP_E_NONAMEDARGS com.sun.star.uno.RuntimeException
DISP_E_OVERFLOW com.sun.star.uno.RuntimeException
DISP_E_PARAMNOTFOUND com.sun.star.uno.RuntimeException
DISP_E_TYPEMISMATCH com.sun.star.uno.RuntimeException
DISP_E_PARAMNOTOPTIONAL com.sun.star.uno.RuntimeException
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages