Try 块抛出异常,但 catch 块没有捕获到它
Try block throws exception, but catch block does not catch it
我正在使用 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 块之外。
有人可以解释这种行为吗?
就在我问这个问题的时候,我意识到了一个问题:
catch 块被忽略,因为 try 块并没有真正抛出异常。
task
对象已设置,它是持有异常的对象。当稍后像这样使用 task
对象时: val account = task.getResult(ApiException::class.java)
那么这就是实际抛出异常的地方。至少这是我在这里所期望的。异常本身基本上在稍后的时间点被捕获、保留和抛出,但是使用旧的堆栈跟踪...
不能 100% 确定它的内部工作原理,但这是我从 logcat 和我的代码中可以看出的。
所以,我没有使用 try-catch,而是手动处理了异常:
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
if(task.exception != null) {
val e = task.exception as? ApiException
if(e != null) {
when(e.statusCode) {
12501 -> return
else -> {
e.printStackTrace()
return
}
}
} else {
task.exception?.printStackTrace()
}
return
}
我正在使用 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 块之外。
有人可以解释这种行为吗?
就在我问这个问题的时候,我意识到了一个问题:
catch 块被忽略,因为 try 块并没有真正抛出异常。
task
对象已设置,它是持有异常的对象。当稍后像这样使用 task
对象时: val account = task.getResult(ApiException::class.java)
那么这就是实际抛出异常的地方。至少这是我在这里所期望的。异常本身基本上在稍后的时间点被捕获、保留和抛出,但是使用旧的堆栈跟踪...
不能 100% 确定它的内部工作原理,但这是我从 logcat 和我的代码中可以看出的。
所以,我没有使用 try-catch,而是手动处理了异常:
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
if(task.exception != null) {
val e = task.exception as? ApiException
if(e != null) {
when(e.statusCode) {
12501 -> return
else -> {
e.printStackTrace()
return
}
}
} else {
task.exception?.printStackTrace()
}
return
}