我正在使用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与他们的类型相同吗? 有没有办法来解决这个问题?因为该库引发了许多不同的异常类型,所以我不能真正地单独捕获每个异常。
答案 0 :(得分:0)
糟糕,抱歉。 事实证明,我正在使用的构建系统将_HAS_EXCEPTIONS = 0添加到了预处理程序定义中。这就是造成这种情况的原因。