编辑“︁
Modula-3
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
===例外=== 例外声明有如下形式:<code>EXCEPTION id(T)</code>,这里的<code>id</code>是一个标识符,而<code>T</code>是除了开放数组之外的一个类型,它声明了<code>id</code>是具有实际参数类型<code>T</code>的例外。如果省略了<code>(T)</code>,这个例外不接受实际参数。例外声明只允许出现在接口和模块的最外层作用域之中。所有的声明的例外都是各不相同的。 <code>RAISE</code>语句有两种形式,没有实际参数的形式:{{code|2="objectpascal"|1=RAISE e}},这里的<code>e</code>是不接受实际参数的一个例外,它的结果是发起例外<code>e</code>;具有实际参数的形式:{{code|2="objectpascal"|1=RAISE e(x)}},这里的<code>e</code>是接受实际参数的一个例外,而<code>x</code>是可赋值给<code>e</code>的实际参数类型的一个表达式,它的结果是引发具有配对实际参数<code>x</code>的例外<code>e</code>。 Modula-3的[[例外处理 (编程)|例外处理]],基于了<code>TRY-EXCEPT</code>语句。采用类似的块系统的有[[Delphi]]、[[Python]]<ref>{{cite web|url= https://www.python.org/doc/faq/general/#why-was-python-created-in-the-first-place|title= Why was Python created in the first place?|quote= I had some experience with using Modula-2+ and talked with the designers of Modula-3 and read the Modula-3 report. Modula-3 is the origin of the syntax and semantics used for exceptions, and some other Python features.|access-date= 2021-06-22|archive-date= 2008-02-23|archive-url= https://web.archive.org/web/20080223222507/http://www.python.org/doc/faq/general/#why-was-python-created-in-the-first-place}}</ref>、[[Scala]]<ref>{{Cite web |url=http://scala.epfl.ch/ |title=Scala Center at EPFL. |access-date=2022-05-15 |archive-date=2020-09-23 |archive-url=https://web.archive.org/web/20200923124042/https://scala.epfl.ch/ }}</ref>和[[Visual Basic.NET]]。 <code>TRY-EXCEPT</code>语句有如下形式: <syntaxhighlight lang="objectpascal"> TRY Body EXCEPT id_1 (v_1) => Handler_1 | ... | id_n (v_n) => Handler_n ELSE Handler_0 END </syntaxhighlight> 这里的<code>Body</code>和每个<code>Handler</code>都是语句,每个<code>id</code>指名一个例外,而每个<code>v_i</code>是一个标识符。<code>ELSE Handler_0</code>和每个<code>(v_i)</code>都是可选的。每个<code>(v_i)</code>声明一个变量,其类型是例外<code>id_i</code>的实际参数类型,而它的[[作用域]]是<code>Handler_i</code>。如果<code>(v_i)</code>缺席,形式<code>id_1, ..., id_n => Handler</code>,是<code>id_1 => Handler; ...; id_n => Handler</code>的简写。 <code>TRY</code>子句执行<code>Body</code>。如果结果是正常的,则忽略<code>EXCEPT</code>等子句。如果<code>Body</code>引发任何列出的例外<code>id_i</code>,则执行<code>Handler_i</code>。在处理具有配对实际参数<code>x</code>的例外<code>id_i</code>的时候,<code>v_i</code>在执行<code>Handler_i</code>之前被初始化为<code>x</code>。如果<code>Body</code>引发任何其他例外,并且<code>ELSE Handler_0</code>存在,则执行它。在这两种情况的任何之一下,<code>TRY-EXCEPT</code>语句的结果是选出的处理器的结果。如果<code>Body</code>引发未列出的例外,而<code>ELSE Handler_0</code>缺席,则<code>TRY-EXCEPT</code>语句的结果是<code>Body</code>引发的例外。 Modula-3还提供<code>TRY-FINALLY</code>语句,它有如下形式:{{code|2="objectpascal"|1=TRY S_1 FINALLY S_2 END}},它执行语句<code>S_1</code>接着执行语句<code>S_2</code>。如果<code>S_1</code>的结果是正常的,则<code>TRY</code>语句的结果等价于<code>S_1; S_2</code>。如果<code>S_1</code>的结果是例外,并且<code>S_2</code>的结果是正常,则在<code>S_2</code>执行之后,重新发起来自<code>S_1</code>的例外。如果二者的结果都是例外,则<code>TRY</code>语句的结果是来自<code>S_2</code>的例外。 在Modula-3中,{{code|2="modula2"|1=EXIT}}和{{code|2="modula2"|1=RETURN}}语句的语义,分别被定义为发起叫做<code>exit-exception</code>和<code>return-exception</code>的例外。<code>exit-exception</code>不接受实际参数,<code>return-exception</code>接受任意类型的实际参数,程序不能显式的命名这些例外。语句{{code|2="modula2"|1=LOOP S END}},非正式的等价于: <syntaxhighlight lang="objectpascal"> TRY S; S; S; ... EXCEPT exit-exception => (*skip*) END </syntaxhighlight>
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息