我正在使用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块之外。
有人可以解释这种行为吗?
答案 0 :(得分:0)
就像我问这个问题一样,我意识到了一些事情:
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)