【发布时间】:2018-01-29 11:05:01
【问题描述】:
我想翻译c++中的java异常处理,不使用RAII。
问题主要是finally块。
我找到了一篇使用以下方法的论文:
“一个困难是 finally 子句必须在每次退出 try 块之前执行。一般的 try 块有惊人数量的潜在退出:正常退出、抛出异常、返回 语句、break 语句、 continue 语句或未能捕获异常。 finally 子句必须在每一个之前执行(如果它们在 try 块或 catch 块中使用)。例如,下面的 Java 代码展示了大部分退出 try 块的方法:
try {
switch (x) {
case 0: continue next;
case 1: break out;
case 2: throw new TException();
case 3: return(0);
}
} catch (Error e) {
throw(e);
} finally {
System.out.println("finally");
}
我们的解决方案是在所有必须执行的地方简单地复制 finally 块的文本。如果 finally 块的大小很大,这可能表明 Java 程序员可能希望将其设为方法,以尽量减少 C++ 中的代码重复。
以下 C++ 代码显示了如何为 try 块的所有退出复制 finally 块:"
try
{
switch(x)
{
case 0:
/* finally clause, continue from try block */
java_lang_System::out->println(_j_toString("finally"));
goto next;
case 1:
/* finally clause, break from try block */
java_lang_System::out->println(_j_toString("finally"));
goto out;
case 2:
/* finally clause, throw exception from try block */
java_lang_System::out->println(_j_toString("finally"));
throw(new TException());
case 3:
/* finally clause, return from try block */
java_lang_System::out->println(_j_toString("finally"));
return(0);
}
}
catch(java_lang_Error *e)
{
/* finally clause, caught exception from try block */
java_lang_System::out->println(_j_toString("finally"));
throw(e);
}
catch(...)
{
/* finally clause, uncaught exception from try block */
java_lang_System::out->println(_j_toString("finally"));
throw;
}
/* finally clause, normal exit from try block */
java_lang_System::out->println(_j_toString("finally"));
我不明白如何在真正的通用程序示例中使用它。 switch中的变量x是什么,应该如何使用?
【问题讨论】:
-
“我想说英语,不使用一般现在时。”
-
"...不使用 RAII" 为什么? Java 最终需要,因为它确实没有具有 RAII。
-
我想翻译c++中的java异常处理,不使用RAII问题从这里开始。
-
转到下一个;你是认真的吗?
标签: java c++ exception-handling switch-statement try-catch-finally