当使用具有 try/catch/finally 的语言时,D 的失败/成功/退出范围语句仍然有用吗? D 似乎没有 finally 这可以解释为什么在 D 中使用这些语句。但是对于像 C# 这样的语言,它有用吗?我正在设计一种语言,所以如果我看到很多专业人士,我会添加它。
最佳答案
scope(X)
不是必需的,就像 for
一样,只要您有 if
和 转到
。
下面是我今天写的一些代码的转述示例:
sqlite3* db;
sqlite3_open("some.db", &db);
scope(exit) sqlite3_close(db);
sqlite3_stmt* stmt;
sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
scope(exit) sqlite3_finalize(stmt);
// Lots of stuff...
scope(failure) rollback_to(current_state);
make_changes_with(stmt);
// More stuff...
return;
将此与使用 try/catch 进行对比:
sqlite3* db;
sqlite3_open("some.db", &db);
try
{
sqlite3_stmt* stmt;
sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
try
{
// Lots of stuff...
try
{
make_changes_with(stmt);
// More stuff...
}
catch( Exception e )
{
rollback_to(current_state);
throw;
}
}
finally
{
sqlite3_finalize(stmt);
}
}
finally
{
sqlite3_close(db);
}
代码变成了spaghetti ,将错误恢复传播到整个商店,并为每个尝试 block 强制缩进。在我看来,使用 scope(X) 的版本更具可读性和更容易理解。
关于c# - D 的作用域失败/成功/退出是否必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1247778/