Dùng "throws" cho class thì có cần phải dùng try catch nữa không?

Có phải dùng “throws” là mình không cần dùng “try - catch” nữa không ạ?

Throw thường xài với try catch. Xài riêng thế nào vậy bạn?

import java.io.BufferedWriter;
import java.io.FileWriter;

public class BufferedWriterExample {

    public static void main(String[] args) throws Exception {
        FileWriter writer = new FileWriter("D:\\testout.txt");
        BufferedWriter buffer = new BufferedWriter(writer);
        buffer.write("Welcome to java.");
        buffer.close();
        System.out.println("Success...");
    }

}

Có đoạn này mình thấy xài “throws” nên mình nghĩ vậy ko biết có phải ko.

Một cách để từ chối dùng try - catch cho toàn bộ mã của bạn. Khi có lỗi thì máy ảo java nó bắt luôn và hiện thông tin ngoại lệ như bình thường.

Khi học thì có thể bỏ qua, nhưng khi thực hiện phần mềm thực tế thì CẦN LƯU Ý:

KHÔNG NÊN từ chối bắt ngoại lệ bằng cách đẩy cho main. Và cũng không nên bắt theo dạng try{} catch(Exception e){} mà nên bắt từng ngoại lệ riêng biệt.

Vì sao? Vì người dùng phần mềm của bạn.
Đối với LTV đủ hiểu biết thì nhìn vào “đống” ngoại lệ đó thì biết những lỗi gì, xảy ra chỗ nào. Nhưng người dùng (đa số là không am hiểu lập trình), họ có biết gì không. Khi đó nếu họ phản hồi thì thông tin bạn nhận chỉ là 1 chữ “LỖI”. Biết đâu mà tìm (lỗi). Cho dù có tên lỗi thì cũng khó dò lỗi.

Khi bắt riêng biệt và có những thông báo lỗi riêng biệt cho từng ngoại lệ, người dùng phản hồi thông báo lỗi đó. Bạn sẽ biết nó xảy ra như thế nào và ở đâu, dựa vào thông tin đó. Quá trình sửa lỗi/bảo trì sẽ dễ dàng.

Gỡ lỗi

Khi cung cấp/phát hành phần mềm cho người dùng thì thông tin gỡ lỗi (debug) không kèm theo không có nên khó biết nó xảy ra ở tập tin:dòng nào. Thông báo cho người dùng chỉ có tên ngoại lệ và thông báo của ngoại lệ đó.

Mọi ngôn ngữ đều nên làm vậy, không riêng java.

9 Likes

Bổ sung ý kiến của @SITUVN.gcd
catch exception không chỉ có ý nghĩa đối với dev mà còn có ý nghĩa với người dùng. Nhất là các ứng dụng cloud, tất cả các ngoại lệ do phần mềm hay logic hệ thống sai đều phải chuyển về dạng Exception, sau đó ExceptionHandler sẽ bắt các ngoại lệ đó và gửi về lỗi cho người dùng

  • Lỗi người dùng nhập vào: 400 BadRequest
  • Lỗi người dùng truy cập vào tài nguyên không thuộc quyền: 401 Unauthorized
  • Data không tìm thấy: 404 NotFound
  • Lỗi do hệ thống (đọc file lỗi) : 500 InternalServerError

Vì thế nếu chỉ catch Exception thì không thể handle các trường hợp logic phức tạp
VD có thể data không tìm thấy nhưng trước đó đọc file lấy data bị lỗi
Ở đây phải handle 2 trường hợp là ngoại lệ đọc file lỗi và data không tìm thấy)

// DO NOT!
public List<Data> getData(File file, String request) {
    List<Data> result = new ArrayList<>();
    try {
        String query = getQuery(request);
        List<Data> data = parseFile(file);
        result = queryData(query);
    } catch (Exception e) {
        // do something
    }
    // do something
    return result;
}

// DO!
public List<Data> getData(File file, String request) {
    List<Data> result = new ArrayList<>();
    try {
        String query = getQuery(request);
        List<Data> data = parseFile(file);
        result = queryData(query);
    } catch (FileNotFoundException fnfe) {
        // send error to client - File Not Found!
    } catch (IOException ioe) {
        // send error to client - Error when proccessing!
    } catch (ParseException pe) {
        // send error to client - Invalid query!
    } catch (Exception e) {
        //  send error to client - Server error!
    }
    // do something
    return result;
}
7 Likes

Mình throws tất cả về main r xử lý 1 thể thì liệu có ổn k nhỉ.

throws có nghĩa là forward lỗi cho nơi khác gọi nó xử lý lỗi đúng không ạ?

3 Likes

Cậu hiểu cơ bản là đúng rồi đó :smile:
throws bắt buộc phải dùng nếu cậu không catch checked exception ở method. Trong TH unchecked exception, cậu có thể bỏ qua phần throws exception (đôi khi cậu vẫn sẽ thấy ai đó throws uncheck exception, chủ yếu để document lại thôi).

Hope it helps!

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?