使用右上角的选项卡切换到不同的编程语言。

使用右上角的选项卡切换到不同的编程语言。

使用右上角的选项卡切换到不同的编程语言。

使用右上角的选项卡切换到不同的编程语言。

trytryTryTrytry尝试(算子)

名称

trytryTryTrytry — 启动一个程序块,用于检测并捕获异常。

签名

try( : : : )

Herror try()

Herror T_try()

void Try()

static void HOperatorSet.Try()

def try() -> None

描述

借助 trytryTryTryTrytrycatchcatchCatchCatchCatchcatchendtryendtryEndtryEndtryEndtryendtrythrowthrowThrowThrowThrowthrow 算子,可在 HDevelop 中实现动态异常处理,其功能与 C++ 和 C# 中的异常处理机制相当。通过 trytryTryTryTrytrycatchcatchCatchCatchCatchcatchendtryendtryEndtryEndtryEndtryendtry 算子可形成两个代码块:第一个代码块(trytryTryTryTrytry .. catchcatchCatchCatchCatchcatch)包含执行常规程序逻辑的受监控程序行。第二个代码块(catchcatchCatchCatchCatchcatch.. endtryendtryEndtryEndtryEndtryendtry)则包含异常发生时执行的代码。

算子 trytryTryTryTrytry 语句用于为后续程序语句启用异常处理,即对后续代码块(直至对应的 catchcatchCatchCatchCatchcatch 语句)进行异常监视。若后续程序行执行过程中发生错误或其他异常状态,或通过 throwthrowThrowThrowThrowthrow 算子显式抛出异常,程序将立即退出 trytryTryTryTrytry 代码块(或根据用户偏好在显示错误消息框后退出),并在对应的 catchcatchCatchCatchCatchcatch 算子处继续执行。若异常在由 trytryTryTryTrytry 块直接或经由其他函数调用进入的函数内部抛出,则该函数调用及调用栈中位于 trytryTryTryTrytry 块上方的所有中间函数调用将立即中止(若适用,同样会在显示错误消息框后中止)。

是否在抛出异常前显示错误消息框,由 HDevelop 参数中的 “在 try-catch 程序段内抑制错误对话框弹出” 选项控制,可通过 编辑->参数选择->一般属性->高级用户 路径访问。该消息框还允许在抛出异常前暂停程序执行,以便编辑可能存在错误的算子调用。

用于监视异常的程序块以对应的 catchcatchCatchCatchCatchcatch 算子结束。 若在监视的 trytryTryTryTrytry 块内未发生异常,则后续的 catchcatchCatchCatchCatchcatch 块将被忽略,程序执行将在对应的 endtryendtryEndtryEndtryEndtryendtry 算子之后继续。

trytryTryTryTrytry-catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry 代码块可在函数内部或跨不同函数调用时任意嵌套,前提是任何内部 trytryTryTryTrytry-catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry 代码块必须完全位于外部 trytryTryTryTrytry-catchcatchCatchCatchCatchcatch catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry 代码块之内。若在内部 trytryTryTryTrytry-catchcatchCatchCatchCatchcatch 块中抛出异常,则该异常处理将由对应的 catchcatchCatchCatchCatchcatch-endtryendtryEndtryEndtryEndtryendtry 块捕获。因此,除非从 catchcatchCatchCatchCatchcatch 块中显式调用 throwthrowThrowThrowThrowthrow 算子重新抛出异常,否则外部 trytryTryTryTrytry-catchcatchCatchCatchCatchcatch 块无法感知该异常。

若在 HALCON 算子中发生错误,将创建异常元组并传递给负责捕获该异常的 catchcatchCatchCatchCatchcatch 算子。该元组收集了错误相关信息,如错误代码和错误文本。捕获异常后,可通过 dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionDatadev_get_exception_data 算子访问这些信息。有关传递的异常数据详情、访问方式及代码导出注意事项,请参阅该算子的说明文档。throwthrowThrowThrowThrowthrow 算子的参考文档则描述了如何抛出用户自定义的异常元组。

HDevelop 提供了禁用 HALCON 错误处理的功能。可通过调用算子 dev_set_check('~give_error')dev_set_check("~give_error")DevSetCheck("~give_error")DevSetCheck("~give_error")DevSetCheck("~give_error")dev_set_check("~give_error") 实现,或在对话框 编辑->参数选择->运行时设置 中取消勾选提示错误 复选框。若关闭错误处理,当发生 HALCON 错误时不会抛出异常,程序执行将正常继续至下一个算子。与此相对,throwthrowThrowThrowThrowthrow 算子将始终抛出异常,且不受 'give_error'"give_error""give_error""give_error""give_error""give_error" 设置影响。参数表达式评估过程中发生的错误同样适用此规则。

注意

C 语言不支持导出 trytryTryTryTrytrycatchcatchCatchCatchCatchcatchendtryendtryEndtryEndtryEndtryendtrythrowthrowThrowThrowThrowthrow 算子,仅 C++、C# 和 VisualBasic/.NET 语言支持。其中仅后者支持跨函数抛出异常。

示例(HDevelop)

try
  read_image (Image, 'may_be_not_available')
catch (Exception)
  if (Exception[0] == 5200)
    dev_get_exception_data (Exception, 'error_message', ErrMsg)
    set_tposition (3600, 24, 12)
    write_string (3600, ErrMsg)
    return ()
  else
    * rethrow the exception
    throw ([Exception,'unknown exception in myproc'])
  endif
endtry

结果

trytryTryTryTrytry 始终返回 2 ( H_MSG_TRUE )。

替代

dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheckdev_set_check

另见

catchcatchCatchCatchCatchcatch, endtryendtryEndtryEndtryEndtryendtry, throwthrowThrowThrowThrowthrow, dev_get_exception_datadev_get_exception_dataDevGetExceptionDataDevGetExceptionDataDevGetExceptionDatadev_get_exception_data, dev_set_checkdev_set_checkDevSetCheckDevSetCheckDevSetCheckdev_set_check

模块

基础