java - Mengapa tidak disyorkan untuk membuang RuntimeException secara langsung dalam kod?
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-06-30 09:56:07
0
5
1426

Menggunakan pengecualian generik seperti Ralat, RuntimeException, Boleh Lempar dan Pengecualian menghalang kaedah panggilan daripada mengendalikan pengecualian benar yang dijana sistem secara berbeza daripada ralat yang dijana aplikasi.

Contoh Kod Tidak Mematuhi

public void foo(String bar) throws Throwable { // Noncompliant throw new RuntimeException("My Message"); // Noncompliant }

Penyelesaian Patuh

public void foo(String bar) { throw new MyOwnRuntimeException("My Message"); }
曾经蜡笔没有小新
曾经蜡笔没有小新

membalas semua (5)
滿天的星座

Ini mudah difahami.
Mari kita gunakan analogi mudah Sekarang untuk membuat log masuk, kod harus ditulis seperti ini.用户不存在/密码错误...这些错误类型, 如果你直接使用RuntimeException

throw new RuntimeException("user not found"); // 用户不存在 throw new RuntimeException("password not match"); // 密码错误
Tangkap pengecualian

try { // ...逻辑 } catch(RuntimeException e) { if("user not found".equals(e.getMessage())) { // ...逻辑 } else if("password not match".equals(e.getMessage())) { // ...逻辑 } }

Sebaliknya, pengecualian tersuai dilaksanakan seperti berikut:

throw new UserNotFoundException("user not found"); // 用户不存在 throw new PasswordNotMatchException("password not match"); // 密码错误
Tangkap pengecualian

try { // ...逻辑 } catch(UserNotFoundException e) { // ...逻辑 } catch(PasswordNotMatchException e) { // ...逻辑 }
Terdapat banyak kelemahan dalam menilai logik pengendalian pengecualian melalui mesej Contohnya, jika mesej dinamik, ia tidak akan dikendalikan dengan tepat

Sudah tentu, kita juga boleh tentukan jenis pengecualian umum, Ia akan menjadi lebih tepat untuk menilai mengikut kod perniagaan, dan ia juga akan mengurangkan definisi jenis pengecualian dan mengurangkan lebihan kod Di bawah ialah sekeping kodkotlin, iaitu cara saya menggunakannya sekarang.message判断处理异常逻辑有很多弊端, 比如message是动态的, 那将无法准确的处理.
当然我们也可以定义一个通用的异常类型, 通过业务码去判断会更加准确, 同时也会减少异常类型的定义, 减少代码的冗余. 下面有一段kotlin

interface BizCode { val code: Int val msg: String } enum class BizCodes(override val code: Int, override val msg: String): BizCode { // ====================================================== // // 公共错误码 0 - 999 // // ====================================================== // /** * 未知错误. */ C_0(0, "未知错误"), /** * HTTP Request 参数错误. */ C_999(999, "HTTP Request 参数错误"), // ====================================================== // // client 错误码 1000 - 1999 // // ====================================================== // /** * 未发现指定 client_id 客户端记录. */ C_1000(1000, "未发现指定 client_id 客户端记录"), C_1001(1001, "client_secret 不匹配"), // ====================================================== // // user 错误码 2000 - 2999 // // ====================================================== // /** * 未发现指定 email 的用户. */ C_2000(2000, "未发现指定 email 的用户"), C_2011(2011, "password 不匹配"), // ; override fun toString(): String { return "[$code] $msg" } } class BizCodeException : RuntimeException { val bizCode: BizCode constructor(bizCode: BizCode) : super(bizCode.toString()) { this.bizCode = bizCode } constructor(bizCode: BizCode, e: Exception) : super(bizCode.toString(), e) { this.bizCode = bizCode } override fun fillInStackTrace() = this }
    女神的闺蜜爱上我

    Penjelasan yang cukup jelas, memudahkan untuk ditangkap dan diproses

      扔个三星炸死你

      Nama pengecualian mesti bermakna, nama RuntimeException tidak bermakna

        刘奇

        Jika anda membuang Exception secara terus, Nginx akan menulis ganti mesej yang ditentukan anda dan anda tidak akan dapat melihat maklumat khusus.
        Pendekatan yang disyorkan adalah untuk menentukan pengecualian sendiri dan mewarisi RuntimeException Ini akan membantu anda mengetahui apakah pengecualian anda dan memudahkan anda mencari masalah.

          typecho

          Pengecualian runtime tidak perlu ditangkap

            Muat turun terkini
            Lagi>
            kesan web
            Kod sumber laman web
            Bahan laman web
            Templat hujung hadapan
            Tentang kita Penafian Sitemap
            Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!