异常和错误代码

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.



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。
  • 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::invoke 时 com.sun.star.script.CannotConvertException 的结果: FailReason::UNKNOWN。内部调用 XInvocation::invoke 导致抛出 com.sun.star.script.CannotConvertException。字段 reason 具有值 UNKNOWN,这表示某种未知错误状态。
E_POINTER 调用了 Bridge_GetValueObject 或 Bridge_GetStruct,但没有提供返回值的参数。
S_OK 正确。


IDispatch::GetIDsOfNames: 的返回值:

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


函数 IDispatch::GetTypeInfo 和 GetTypeInfoCount 返回 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