是否可以使用catch语句中的"转到"

Jon*_*nyK 6 c++ goto try-catch

我曾经被告知过的一切都是邪恶的,远离他们,但我认为他们可以帮助我(?).我想为用户提供一个选项,以便在发现异常时重新启动应用程序,并且在我要做什么事情时遇到一些麻烦...

我的应用程序将由另一个进程监视,但是有一些例外,我希望用户能够在不将控制权返回给调用进程的情况下决定做什么.

这样的事情是"可接受的"吗?还有其他建议吗?

非常感谢!

int main(){

    initialize:
       try{
        //do things
       }
       catch(...)
       {
          cout<<"Would you like to try initializing again?"<<endl;

          //if yes
            goto initialize;

          //if not
          abort(); //or something...
        }

return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mār*_*dis 8

为什么不喜欢这个?

while(true){
  //Do stuff
  if(exit){
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

continue = true;
do{
  //Do stuff
  if(exit){
    continue = false;
  }
}while(continue);
Run Code Online (Sandbox Code Playgroud)

  • @Jon,如果你需要跳入和跳出循环,那么你必须在它自己的函数中分离它,然后只需在需要时调用该函数. (3认同)

小智 6

你可以尝试:

int main()
{
     while(true)
     {
          try
          {
               program();
          }
          catch(std::exception& e)
          {
               std::cout << "Start again?" << std::endl;
               //Check ...
               if(!go_on)
                    break;
          }
     }
     return 0;
}
Run Code Online (Sandbox Code Playgroud)


sha*_*oth 5

是的,从技术上讲这是可以的,但通常的“转到被认为有害”的考虑因素适用。

  • `goto` 没问题。它是最简单的流控制机制,并且找到跳转目标比其他任何机制都简单。如果它避免重复,那么它就没有问题;在 C++ 中,几乎不可能使用 `goto` 将自己束缚在结中,因为你实际上无法走到任何地方,如此混乱地足够远,以至于它可能会导致你还没有遇到的问题。 (8认同)
  • @Paul:你有没有比较一下有多少人被瘟疫杀死,有多少人使用了“goto”? (6认同)
  • goto 永远不会好 - 避免它像瘟疫一样。当你以后有错误时,它会咬你。甚至永远不要考虑它。 (2认同)
  • 看看哪个答案在一个月内出现在首位。如果有足够多的人仍在使用 goto 来提高您的答案,我会感到失望。 (2认同)
  • 借调。天啊,五年的计算,人们仍然捍卫“goto”作为一种有效的编码实践。难怪这么多软件仍然很烂。 (2认同)
  • *把手指伸进耳朵里*我讨厌去拉拉拉拉拉 (2认同)

Dev*_*lar 5

一个goto可以随时被避免,给人干净的代码.

顺便说一下,break在a之外的情况也是如此switch.该continue关键字略微受到谴责,因为至少它尊重封闭循环的条件.

在正确的地方捕捉异常非常重要 - 您可以最有效地处理这种情况.

如果一个条件变得不方便(就像我的情况中的"再试一次?"),考虑否定它("失败?")以获得更清洁的结构.

// Tries until successful, or user interaction demands failure.
bool initialize() {
    for ( ;; ) {
        try {
            // init code
            return true;
        }
        catch ( ... ) {
            cout << "Init Failed. Fail Program?" << endl;
            if ( yes ) {
                return false;
            }
        }
    }
}

int main() {
    if ( ! initialize() ) {
        return EXIT_FAILURE;
    }
    // rest of program
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

注意:这不使用gotobreak,并且它不会递归(特别是不在catch块内).

  • 早期回归只是伪装的转折?开玩笑! (2认同)