尝试块引发异常,但捕获块无法捕获

我正在使用Google登录名,但出现异常。但是,看来我无法抓住它。

我有以下代码:

override fun onactivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        super.onactivityResult(requestCode,resultCode,data)
        when (requestCode) {
            RC_SIGN_IN -> {
                val task = try{
                    GoogleSignIn.getSignedInaccountFromIntent(data)
                } catch (e: ApiException) {
                    Log.d("EXCEPTION",e.message)
                    when(e.statusCode) {
                        12501 -> return
                        else -> {
                            e.printStackTrace()
                            return
                        }
                    }
                }
...

从Logcat中我可以看到ApiException是捕获的正确异常:

尝试块引发异常,但捕获块无法捕获

它绝对是我正在捕捉的那个:

尝试块引发异常,但捕获块无法捕获

起初,我认为出于某种原因,可能直接与val task = try...进行分配,因此我相应地更改了代码并尝试了以下方法:

var task: Task<GoogleSignInaccount>?
try{
    task = GoogleSignIn.getSignedInaccountFromIntent(data)
} catch (e: ApiException) {
    Log.d("EXCEPTION",e.message)
    when(e.statusCode) {
       12501 -> task = null
       else -> {
           e.printStackTrace()
           task = null
       }
    }
}

仍然,相同的行为。所以我想也许还有 引发了另一个异常,所以我添加了另一个catch块:

var task: Task<GoogleSignInaccount>?
try{
    task = GoogleSignIn.getSignedInaccountFromIntent(data)
} catch (e: ApiException) {
    Log.d("EXCEPTION",e.message)
    when(e.statusCode) {
       12501 -> task = null
       else -> {
           e.printStackTrace()
           task = null
       }
    }
} catch (e: Exception) {
    Log.d("EXCEPTION",e.message)
    task = null
}

仍然是相同的行为。我已经在每个步骤上发现了带有断点的代码,但是它完全忽略了catch块。我停在try块:

尝试块引发异常,但捕获块无法捕获

但是,如果我继续,下一步就是在try-catch块之外。

尝试块引发异常,但捕获块无法捕获

有人可以解释这种行为吗?

lch90120201 回答:尝试块引发异常,但捕获块无法捕获

就像我问这个问题一样,我意识到了一些事情:

catch块将被忽略,因为try块不会真正引发异常。

设置了static void _Continue(QStringList &sl) { QString s; { s.append(sl.takeFirst()); // File s.append(":"); s.append(sl.takeFirst()); // Line s.append("<br> "); // Outputting to a text box. s.append(sl.takeFirst()); // Func } /* Parse Expression */ QStringList args; { QString expr(sl.takeFirst()); // Expression bool isQuote (false); // "" bool isLiteral(false); // '' bool isPointer(false); // -> int roundLevel(0); // () int curlyLevel(0); // {} int squarLevel(0); // [] int angleLevel(0); // < > // Fixme handle <<,>>,<= etc expr.remove(QRegularExpression("[/][*].*[*][/]")); // Remove Comments QString arg; QRegularExpression re_CommaWhitespaceAtBeginning("^[,\t\n]*"); while (!expr.isEmpty()) { if (isPointer && expr.front().unicode() != u'>') { isPointer = false; } switch (expr.front().unicode()) { case u'-' : { isPointer = true; // potentially break; } case u'"' : { isQuote = !isQuote; break; } case u'\'': { isLiteral = !isLiteral; break; } case u'(' : { if (isQuote) { break; } roundLevel++; break; } case u')' : { if (isQuote) { break; } roundLevel--; break; } case u'[' : { if (isQuote) { break; } squarLevel++; break; } case u']' : { if (isQuote) { break; } squarLevel--; break; } case u'{' : { if (isQuote) { break; } curlyLevel++; break; } case u'}' : { if (isQuote) { break; } curlyLevel--; break; } case u'<' : { if (isQuote) { break; } angleLevel++; break; } case u'>' : { if (isQuote || isPointer) { isPointer = false; break; } angleLevel--; break; } case u'\\': { if (isQuote) { arg.append(expr.front()); } break; } case u',' : { if (isQuote || isLiteral || roundLevel || curlyLevel || squarLevel || angleLevel) { break; } args << arg.remove(re_CommaWhitespaceAtBeginning); arg.clear(); break; } default : { } } arg.append(expr.front()); expr.remove(0,1); } args << arg.remove(re_CommaWhitespaceAtBeginning); } // sl should now have only values; // args should be shorter than sl,even with error for (int i = 0; !args.isEmpty(); i++) { sl.replace(i,args.takeFirst() + "<br/>" + sl.at(i)); } sl.prepend(s); /* Messages stored on a map,signal sent to update it. */ MainWindow::s_StdoutMap.append(sl.join("<br/><br/>")); emit MainWindow::s_MW->on_actionUpdate_triggered(); } template<typename type,typename ... T> static void _Continue(QStringList &sl,type t,T ... args) { sl << (*MainWindow::s_MW << t); // overloaded << operator to handle T MainWindow::_Continue(sl,args ...); } template<typename ... T> static void _Start(QString file,int line,QString func,QString expr,T ... args) { QStringList sl; { sl << file; sl << QString::number(line); sl << func; sl << expr; } MainWindow::_Continue(sl,args ...); } #define ct_Debug(...)MainWindow::_Start(__FILE__,__LINE__,__PRETTY_FUNCTION__,\ #__VA_ARGS__,__VA_ARGS__) 对象,它包含异常。以后像这样使用task对象:task时,实际上就是引发异常的地方。至少那是我在这里的期望。异常本身基本上是在以后的某个时间点被捕获,保留和抛出的,但是具有旧的堆栈跟踪...

不能100%知道它的内部工作原理,但这就是我从logcat和我的代码中可以得出的结论。

因此,我没有去尝试捕获,而是简单地手动处理了异常:

val account = task.getResult(ApiException::class.java)
本文链接:https://www.f2er.com/2710021.html

大家都在问