ArcObjects 错误代码

ArcObjects 错误代码

本主题概述了与 ArcObjects 相关的 HRESULT,并帮助您破译了在编程开发的过程中遇到的 HRESULT 错误代码。 本主题还介绍了 HRESULT 是什么,以及如何在 ArcObjects SDK For .NET 中找到有关这些错误代码的信息;还提供了使用 HRESULT 时经常需要的数字转换的详细说明。

HRESULT 错误代码

在 .NET 中使用 ArcObjects 进行编程时,您可以调用 COM 组件,因此,会收到来自 COM 组件的错误提示信息。

所有 COM 方法都会返回一个无符号整数 (HRESULT)。HRESULT 本质上是一个结构,用于指示所执行的函数是成功还是失败,并包含【有关操作结果的】其他详细信息。 HRESULT 的值,通常用于返回错误信息(未被特别视为错误代码)。

.NET 运行时处理来自 COM 组件的错误,类似于 VB 6 处理 COM 错误的方式。如果 .NET 程序调用 COM 组件中的函数,并返回错误条件(以 HRESULT 形式),则 HRESULT 会被填充到 COMException 的实例中去。此 COMException 由 .NET 运行时引发,可在 Try、Catch、Finally 块中进行处理。有关实现 Try、Catch、Finally 块和 COMException 的更多信息,请参阅 How to implement error handling

ArcObjects 库的大多数 HRESULT 错误常量都记录在 ArcObjects SDK For .NET 的帮助系统中(请参阅本主题中的 ArcObjects HRESULT error codes ),该帮助系统作为 SDK 安装帮助的一部分,我们可从中获取到它;或从 ArcGIS Resource Centers Web 上的 ArcObjects namespace reference 中获取。

可以在 MSDN 网站上找到不特定于 ArcObjects 的 HRESULT。有关常见 MSDN HRESULT 值的列表,请参阅 MSDN 上的 Common HRESULT Values

定位 HRESULT

HRESULT 以 8 位十六进制形式 (80004005) 或 10 位十进制形式 (- 2147467259) 返回。大多数 ESRI ArcObject 的错误代码,都是 10 位十进制格式

以下【ArcObjects HRESULT 错误代码表】列出了所有可用的错误代码页面(以超链接形式),以及每个库(dll)包含的 HRESULT 值范围。如果未列出某个库,则该库当前没有特定的 HRESULT 错误代码,不过,您会收到一般 COM 错误。

如果您收到 8 位十六进制错误代码,请将这个 8 位十六进制代码,转换为一个 10 位十进制代码。这种转换并不困难,可以使用 Windows 计算器完成。

一些 ArcObjects 库使用 3位的值,而不是 10 位十进制数值。这些库分别是

  • ESRI.ArcGIS.Geometry(esriGeometryError 和 esriSpatialReferenceError 枚举)

  • ESRI.ArcGIS.Geodatabase(esriDataConverterError 枚举)。

有关如何将一个 10 位十进制值,转换为一个 3 位枚举值的信息,请参阅本主题中的 Converting 10-digit decimal value to three-digit enumeration value

ArcObjects HRESULT 错误代码

Enumeration Library Min value Max value
esriDataConverterError Geodatabase 513 532
esriGeometryError Geometry 513 602
esriSpatialReferenceError Geometry 514 524
cadastralError Cadastral - 2147221247 - 2147220732
dimError Carto - 2147220991 - 2147220989
annoError Carto - 2147220991 - 2147220985
esriRasterLayerError Carto - 2147217152 - 2147217152
esriImageServerError Carto - 2147216896 - 2147216895
esriNETCDFError DataSourcesNetCDF - 2147217408 - 2147217401
esriRasterLoaderError DataSourcesRaster - 2147217407 - 2147217408
esriRasterError DataSourcesRaster - 2147217408 - 2147217370
esriRepresentationDrawingError Display - 2147218431 - 2147218425
esriEditorError Editor - 2147220990 - 2147220990
esriSpatialAnalystError GeoAnalyst - 2147217408 - 2147217248
esriXYEventError Geodatabase - 2147220991 - 2147220983
esriNetworkErrors Geodatabase - 2147220991 - 2147220879
fdoError Geodatabase - 2147220991 - 2147212030
esriTinError Geodatabase - 2147219456 - 2147219388
esriRepresentationError Geodatabase - 2147218687 - 2147218670
esriGeoDataServerError GeoDatabaseDistributed - 2147208551 - 2147208540
esriTerrainError GeoDatabaseExtensions - 2147205120 - 2147219396
esriGeocodingError Location - 2147220991 - 2147220969
esriRouteEventError Location - 2147220991 - 2147220956
esriUtilityNetworkErrors NetworkAnalysis - 2147220911 - 2147220225
esriExportErrorReturnCodes Output - 2147220735 - 2147220719
esriOutputErrorReturnCodes Output - 2147220686 - 2147220670
esriSchematicErrors Schematic - 2147218943 - 2147218923
esriCoreErrorReturnCodes esriSystem - 2147221247 - 2147221243
messageSupportError esriSystem - 2147220991 - 2147220967
tascTMSWorkspaceError TrackingAnalyst - 2147220480 - 2147220352
tascGSDCoreError TrackingAnalyst - 2147219456 - 2147219392
tascTemporalLayerError TrackingAnalyst - 2147219199 - 2147219135

将 8 位十六进制值转换为 10 位十进制值

(1)8位十六进制数,转成32位二进制数;

(2)32位二进制数,每位取反;

(3)取反后,(32位二进制数)加1;

(4)转为10位十进制数。

(5)换符号(乘以 -1 )

本质:负数补码的十进制表示

例子:

0x8004 0208 => (1000 0000 0000 0100 0000 0010 0000 1000) //原码
		    => (1111 1111 1111 1011 1111 1101 1111 0111) //取反后得到
		    => (1111 1111 1111 1011 1111 1101 1111 1000) //加1后得到
		    => (-2,147,220,984) //转为十进制后得到
求取 -1 的二进制补码:

[-1]10进制 = [10000001]原码 = [11111110]反码 = [11111111]补码

注:反码的符号位与原码一致。

将 10 位十进制值转换为 8 位十六进制值

(1)10 位十进制值,乘以 -1,以换符号;

(2)转为二进制数(须为32位);

(3)减1;

(4)每位取反;

(5)转为十六进制;

本质:负数未取补码的逆过程,所得负数转为十六进制

例子:

-2,147,220,984 => ( 2,147,220,984) //乘以-1 后得到
			   => (0111 1111 1111 1011 1111 1101 1111 1000) //转为二进制后得到
			   => (0111 1111 1111 1011 1111 1101 1111 0111) //减1后得到
			   => (1000 0000 0000 0100 0000 0010 0000 1000) //取反后得到
			   => (8004 0208) //转为十六进制后得到

将 10 位十进制值转换为三位枚举值

如果您从 Geometry(esriGeometry 和 esriSpatialReference)或 Geodatabase (esriDataConverter) 库中获得了 10 位错误,请执行以下步骤从您的 10 位错误值中获取三位值:

(1)将 10 位十进制值转换为 8 位十六进制值(按上述步骤进行);

(2)取最后三位数,作为十六进制数,然后转为十进制数;

-2,147,220,984 => (8004 0208) 十六进制
			   => 0x208 转为 十进制,得到 520
posted @ 2022-02-25 16:12  误会馋  阅读(199)  评论(0编辑  收藏  举报