try块限制const变量的作用域

12

当我尝试对常量进行初始化时,我经常遇到作用域问题。

try {
  const int value = might_throw();
}
std::cout << value << "\n";  /* error, value out of scope */

目前我使用一个临时值作为权宜之计。有没有更好的方法来处理 const - try {} 的情况?

int tmp;  /* I'd rather have tmp const */
try {
  tmp = might_throw();
}
catch (...) {
  /* do something */
}
const int value = tmp;

4
为什么在 try 块中没有使用该变量? - Konrad Rudolph
1
这个变量可能在try块后面的许多行中使用。你是说我应该扩大我的try块来包含所有东西,即使其中包括许多只与变量使用相关的代码行吗? - Micha Wiedenmann
1
不一定。我只是想先解决可能最简单的解决方案。我同意在某些情况下这是一个问题。 - Konrad Rudolph
3个回答

10

与其你的

int tmp;  /* I'd rather have tmp const */
try {
    tmp = might_throw();
}
catch (...) {
    /* do something */
}
const int value = tmp;

你可以这样做:

int int_value()
{
    try {
        return might_throw();
    }
    catch (...) {
        /* do something */
        return the_something_value;
    }
}

int main()
{
    int const value = int_value();
}

或者,在C++11中您可以这样做:

int main()
{
    int const value = []() -> int {
        try {
            return might_throw();
        }
        catch (...) {
            /* do something */
            return the_something_value;
        }
    } ();
}

3

对我来说,这似乎是一个函数的案例:

int const value = []()->int {
    try { return might_throw(); }
    catch (...) { return come_up_with_a_value_differently(); }
}();

0
try {
   const int value = might_throw();
   std::cout << value << '\n';
}
catch (...) {
   std::cout << "threw instead of giving me a value :(\n";
}

try 有其作用域的原因!

如果你要做的不仅仅是使用 std::cout 打印 value,那么代码会变得有点混乱。这时你可以选择:

  • 去掉 const
  • 将所有使用 value 的逻辑都放在 try 中,或者
  • 从函数 int mightThrowWrapper(int default = 0) 返回的值中初始化一个 const int,该函数本身包装了 try/catch 并在抛出异常时返回默认值。这样你就可以实现局部的异常处理和 const 了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接