基类未捕获C ++异常

时间:2019-01-24 11:10:43

标签: c++ exception-handling

我正在使用Visual C ++ 2017编译以下代码(已启用C ++ 17功能)

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = findViewById(R.id.webview);
    myWebView.loadUrl("http://www.google.com");
    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
}

public void myMethod(String test){
    Toast.makeText(this, test, Toast.LENGTH_SHORT).show();

}

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        ((MainActivity)mContext).myMethod("hello");
    }
}

}

编译器按预期报告:

int main() {
  try {
    // loot is some library that is linked as a dll
    auto game = loot::CreateGameHandle(loot::GameType::fonv, "c:\\something\\invalid", "C:\\something\\invalid");
    // throw std::invalid_argument("this works as expected");
  }
  catch (const std::exception &e) {
    std::cout << "caught as exception " << e.what() << std::endl;
  }
  catch (const std::invalid_argument &e) {
    std::cout << "caught as invalid_argument " << e.what() << std::endl;
  }
  catch (...) {
    std::cout << "caught by ..." << std::endl;
  }
}

但是,应用程序输出是

warning C4286: 'const std::invalid_argument &': is caught by base class ('const stdext::exception &') on line 8

这不仅是更改捕获顺序或其他操作,如果我删除了最后2个捕获块,则由于未处理的异常,应用程序将崩溃。

那怎么可能?我以为这与使 my std :: exception与库中继承自std :: invalid_argument的类型不同的编译器设置有关,但是为什么 my std :: invalid_argument与他们的类型相同吗? 有没有办法来解决这个问题?因为该库引发了许多不同的异常类型,所以我不能真正地单独捕获每个异常。

1 个答案:

答案 0 :(得分:0)

糟糕,抱歉。 事实证明,我正在使用的构建系统将_HAS_EXCEPTIONS = 0添加到了预处理程序定义中。这就是造成这种情况的原因。