Невозможно отловить исключение из другой функции - PullRequest
1 голос
/ 01 марта 2020

Я ожидаю, что «throw RuntimeException» в ServerHandler перейдет к блоку перехвата в registerAccount, когда с сервера выскакивает код ошибки 403, но я не могу перехватить ошибку ... ниже мой код:

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$5.onErrorResponse(ServerHandler.kt:75)

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Из-за асинхронной функции в обратных вызовах Volley отладчик Android Studio помог подтвердить, что registerAccount () возвратил результат, прежде чем makeHttpRequest () выполнил свою работу по взаимодействию с PHP сервером.

При возврате registerAccount (), выбрасывая RuntimeException («Имя пользователя взято») из makeHttpRequest (), не осталось никого, чтобы перехватить его исключения, из-за чего исключение не может быть перехвачено.

В этом В этом случае перехват исключений кажется невозможным, поэтому вместо создания исключений я бы просто выбрал Toast.makeText (_context, «Имя пользователя уже занято!», Toast.LENGTH_LONG) .show ().

1 голос
/ 01 марта 2020

Я не знаю всех деталей, но кажется, что вызов ServerHandler.getInstance(context).makeHttpRequest( должен возвращаться мгновенно (даже до того, как будут сделаны какие-либо HTTP-запросы).

Просто поместите запись в журнал после вызова, но до return тоже посмотрим, так ли это на самом деле. HTTP-запрос, вероятно, будет сделан позже в какой-то момент (возможно, в другом потоке), когда функция registerAccount долго, но вышла (как и блок try / catch, определенный внутри).

...