无法捕获从另一个函数抛出的异常
Unable to catch exception being thrown from another function
当服务器弹出错误代码 403 时,我希望 ServerHandler 中的 "throw RuntimeException" 继续到 registerAccount 中的 catch 块,但我无法捕捉到错误...下面是我的代码:
LoginRepo.kt:
private fun registerAccount(context: Context, jsonObject: JSONObject, username: String, password: String): Result<LoggedInUser> {
try {
ServerHandler.getInstance(context).makeHttpRequest(
"http://www.mywebpage.com/index.php",
Request.Method.POST,
jsonObject
)
return Result.Success(LoggedInUser(java.util.UUID.randomUUID().toString(), username))
} catch (e: Throwable) {
return Result.Error(IOException("Error registering account: ", e))
}
}
ServerHandler.kt:
@Throws(RuntimeException::class)
fun makeHttpRequest(url: String, method: Int, jsonBody: JSONObject? = null):Any {
// Instantiate the RequestQueue.
Log.d("makeHttpRequest","Sending request!!!!")
var stringRequest = when (method) {
Request.Method.POST ->
object : StringRequest(method, url,
Response.Listener<String> { response ->
Log.d("requestPOST", response)
}, Response.ErrorListener { error ->
@Throws(RuntimeException::class)
when(error.networkResponse.statusCode) {
403 -> {
throw RuntimeException("Username is taken.") //<--RuntimeException
}
else-> {
Log.d("UNHANDLED ERROR:", error.toString())
}
}})
}
}
错误:
java.lang.RuntimeException: Username is taken.
at com.example.inspire.data.ServerHandler$makeHttpRequest$stringRequest.onErrorResponse(ServerHandler.kt:75)
我不知道所有细节,但似乎调用 ServerHandler.getInstance(context).makeHttpRequest(
必须立即返回(甚至在发出任何 HTTP 请求之前)。
只需在调用之后但在 return
之前放置一个日志记录语句,看看是否确实如此。当 registerAccount
函数已经很长时间但退出时(其中定义的 try
/catch
块也是如此),HTTP 请求可能会在稍后的某个时间点(可能在另一个线程中)发出。
由于 Volley 回调中的异步功能,Android Studio 调试器已帮助确认 registerAccount() 已在 makeHttpRequest() 完成其与 [=21= 通信的工作之前返回结果] 服务器.
由于registerAccount()已经返回,makeHttpRequest()抛出的RuntimeException("Username is taken.")已经没有人去捕获它的异常了,导致异常无法捕获
在这种情况下,捕获异常听起来是不可能的,所以我宁愿做一个
Toast.makeText(
_语境,
"Username already taken!",
Toast.LENGTH_LONG
)。展示()
而不是抛出异常...
当服务器弹出错误代码 403 时,我希望 ServerHandler 中的 "throw RuntimeException" 继续到 registerAccount 中的 catch 块,但我无法捕捉到错误...下面是我的代码:
LoginRepo.kt:
private fun registerAccount(context: Context, jsonObject: JSONObject, username: String, password: String): Result<LoggedInUser> {
try {
ServerHandler.getInstance(context).makeHttpRequest(
"http://www.mywebpage.com/index.php",
Request.Method.POST,
jsonObject
)
return Result.Success(LoggedInUser(java.util.UUID.randomUUID().toString(), username))
} catch (e: Throwable) {
return Result.Error(IOException("Error registering account: ", e))
}
}
ServerHandler.kt:
@Throws(RuntimeException::class)
fun makeHttpRequest(url: String, method: Int, jsonBody: JSONObject? = null):Any {
// Instantiate the RequestQueue.
Log.d("makeHttpRequest","Sending request!!!!")
var stringRequest = when (method) {
Request.Method.POST ->
object : StringRequest(method, url,
Response.Listener<String> { response ->
Log.d("requestPOST", response)
}, Response.ErrorListener { error ->
@Throws(RuntimeException::class)
when(error.networkResponse.statusCode) {
403 -> {
throw RuntimeException("Username is taken.") //<--RuntimeException
}
else-> {
Log.d("UNHANDLED ERROR:", error.toString())
}
}})
}
}
错误:
java.lang.RuntimeException: Username is taken.
at com.example.inspire.data.ServerHandler$makeHttpRequest$stringRequest.onErrorResponse(ServerHandler.kt:75)
我不知道所有细节,但似乎调用 ServerHandler.getInstance(context).makeHttpRequest(
必须立即返回(甚至在发出任何 HTTP 请求之前)。
只需在调用之后但在 return
之前放置一个日志记录语句,看看是否确实如此。当 registerAccount
函数已经很长时间但退出时(其中定义的 try
/catch
块也是如此),HTTP 请求可能会在稍后的某个时间点(可能在另一个线程中)发出。
由于 Volley 回调中的异步功能,Android Studio 调试器已帮助确认 registerAccount() 已在 makeHttpRequest() 完成其与 [=21= 通信的工作之前返回结果] 服务器.
由于registerAccount()已经返回,makeHttpRequest()抛出的RuntimeException("Username is taken.")已经没有人去捕获它的异常了,导致异常无法捕获
在这种情况下,捕获异常听起来是不可能的,所以我宁愿做一个 Toast.makeText( _语境, "Username already taken!", Toast.LENGTH_LONG )。展示() 而不是抛出异常...