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

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 kod kotlin, 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