thảo luận Best practice cho việc throw exception?

ý em là
Java:
class UserService {
    public User getUserInfo(int id) {
        // logic
        if (...) {
             throw UserNotFoundException("user not found");
        }

    }
}

Java:
class UserHttpController {
    private UserService userService;

    @GetMapping("/users/{id}")
    public Response<User> getUser(@RequestParam int id) {
 try {
    User user = userService.getUser(id);
    return Response(Http.Ok, ...);
 } catch (UserNotFound e) {
    return Response(Http.NotFound, ...);

 } catch (Exception e) {
    return Response(Http.Internal, ...);
   }
}

}

hay là các bác dùng kiểu gì khác kiểu này để tối ưu code hơn vậy
Java thì ko rành nhưng đoán là có thôi, vì vụ này quá basic là xài 1 cái middleware để làm global exception handler
 
Thím nào kị dùng exception thì phải cân nhắc tới những lợi ích của nó nhé. Ngoài việc đảm bảo yêu cầu về mặt chức năng, logic nghiệp vụ thì phải dễ monitor, dễ maintain nữa. Các hệ thống monitoring, logging nó đều có cơ chế lắng nghe, thống kê chỉ số exception, http status để đưa ra cảnh báo. Lúc đó việc code nó diễn ra tự nhiên và các thím chỉ cần tập trung vào nghiệp vụ thôi. Hiệu năng bị down tí khi có exception nó không quan trọng bằng lợi ích monitor hệ thống mà nó mang lại. Nếu bỗng dưng có một lượng bad request đẩy vào API làm cho nó bắn exception liên tọi và CPU+RAM lên cao thì alert lên để mà còn biết.
 
exception phải là cái cực kì bất ngờ, như connection vào db đang chạy ngon lành bỗng dưng bị đứt bóng vì server db sập thì cái đó mới là exception, còn id ko tồn tại trong bảng mà quăng exception thì backend dev gì ngu vậy
3916-pepedumb.png



ngôn ngữ có exception mà xài vô tội vạ thì là dev ocschos hết, tránh xa cái fw đó ra
X0OgXK6.png


có lẽ nó muốn code nó đẹp, function signature đẹp, ví dụ User getUser(id) chứ đéo muốn xấu xí như expected<User> getUser(id) hay tuple<User, ErrorCode> getUser(id) nên xài exception vô tội vạ, thì về lớp 1 dạy vở sạch chữ đẹp đi chứ làm công việc logic làm gì mà thích vở sạch chữ đẹp hơn logic
X0OgXK6.png
 
Sửa lần cuối:
exception phải là cái cực kì bất ngờ, như connection vào db đang chạy ngon lành bỗng dưng bị đứt bóng vì server db sập thì cái đó mới là exception, còn id ko tồn tại trong bảng mà quăng exception thì backend dev gì ngu vậy
3916-pepedumb.png



ngôn ngữ có exception mà xài vô tội vạ thì là dev ocschos hết, tránh xa cái fw đó ra
X0OgXK6.png


có lẽ nó muốn code nó đẹp, function signature đẹp, ví dụ User getUser(id) chứ đéo muốn xấu xí như expected<User> getUser(id) hay tuple<User, ErrorCode> getUser(id) nên xài exception vô tội vạ, thì về lớp 1 dạy vở sạch chữ đẹp đi chứ làm công việc logic làm gì mà thích vở sạch chữ đẹp hơn logic
X0OgXK6.png
Nếu không exception thì ở tầng controller if else cái object trả về có mà chết
 
tại sao thrown ex nó lại tốn tới 1000 cycle vậy thím, cái này hay nè, code thì đẹp hơn if/else mà performance thì tệ thế nhỉ ?

Có lẽ giờ CPU quá mạnh rồi, nên dev ko quan tâm vụ này lắm, trừ khi nó quá chậm.
new exception là operation access vào stack trace, nên chậm

1 khi đã có exception thì chỉ có log với tạo jira issue fix bug :LOL: , bên em làm như vậy
 
Nên hạn chế throw exception, có thể dùng Result Pattern để trả về kết quả. Đã ném exception thì phải xử lý. Cực kì ngán những ai dùng exception để làm flow control.
 
exception phải là cái cực kì bất ngờ, như connection vào db đang chạy ngon lành bỗng dưng bị đứt bóng vì server db sập thì cái đó mới là exception, còn id ko tồn tại trong bảng mà quăng exception thì backend dev gì ngu vậy
3916-pepedumb.png



ngôn ngữ có exception mà xài vô tội vạ thì là dev ocschos hết, tránh xa cái fw đó ra
X0OgXK6.png


có lẽ nó muốn code nó đẹp, function signature đẹp, ví dụ User getUser(id) chứ đéo muốn xấu xí như expected<User> getUser(id) hay tuple<User, ErrorCode> getUser(id) nên xài exception vô tội vạ, thì về lớp 1 dạy vở sạch chữ đẹp đi chứ làm công việc logic làm gì mà thích vở sạch chữ đẹp hơn logic
X0OgXK6.png
Không nên lạm dụng exception thì đúng chứ bảo chỉ xài cho thứ cực bất ngờ thôi thì nghe hài hài.
Đầy FW nổi tiếng nó vẫn throw exception như là một constraint ràng buột các layer bên ngòai phải handle. Anh return error thì nó có thể có hoặc có thể không handle.
Ví dụ đọc file mà file ko tồn tại thì có được gọi là cực bất ngờ không ?
 
Không nên lạm dụng exception thì đúng chứ bảo chỉ xài cho thứ cực bất ngờ thôi thì nghe hài hài.
Đầy FW nổi tiếng nó vẫn throw exception như là một constraint ràng buột các layer bên ngòai phải handle. Anh return error thì nó có thể có hoặc có thể không handle.
Ví dụ đọc file mà file ko tồn tại thì có được gọi là cực bất ngờ không ?
đương nhiên là ko bất ngờ. Nó là lỗi liên quan trực tiếp tới việc open file thì sao gọi là bất ngờ được??
thằng Java nó throw thì nó là ngôn ngữ ngu học cho mấy thằng ngu kiếm tiền chứ có phải ngôn ngữ được ca tụng là logic đâu
thằng java thì chúa hack rồi. Generic đéo có nên nó hack treo đầu dê generic thực chất chỉ là thịt chó đa hình nên chậm vl, vd chỉ có thằng ngu mới xài ArrayList<Int>. Đéo có lambda expression nên cũng phải hack làm cái Runnable interface. Đéo có keyword nodiscard nên chắc cũng phải hack kiểu ép xử lý lỗi bằng ngoại lệ. Thay vì update language thêm feature thì sợ fuk tạp ko dám add, nên toàn xài hack ko chứ logic mẹ gì. Sau này cũng phải ăn lại cứt mình ỉa ra thêm mấy feature mới vào rồi.
 
Sửa lần cuối:
đương nhiên là ko bất ngờ. Nó là lỗi liên quan trực tiếp tới việc open file thì sao gọi là bất ngờ được??
thằng Java nó throw thì nó là ngôn ngữ ngu học cho mấy thằng ngu kiếm tiền chứ có phải ngôn ngữ được ca tụng là logic đâu
thằng java thì chúa hack rồi. Generic đéo có nên nó hack treo đầu dê generic thực chất chỉ là thịt chó đa hình nên chậm vl, vd chỉ có thằng ngu mới xài ArrayList<Int>. Đéo có lambda expression nên cũng phải hack làm cái Runnable interface. Đéo có keyword nodiscard nên chắc cũng phải hack kiểu ép xử lý lỗi bằng ngoại lệ. Thay vì update language thêm feature thì sợ fuk tạp ko dám add, nên toàn xài hack ko chứ logic mẹ gì. Sau này cũng phải ăn lại cứt mình ỉa ra thêm mấy feature mới vào rồi.
Java làm gì có ArrayList<Int>, Lamda expression thì liên quan gì đến Runnable interface ?? Hay lộn sang Functional interface ??
 
đương nhiên là ko bất ngờ. Nó là lỗi liên quan trực tiếp tới việc open file thì sao gọi là bất ngờ được??
thằng Java nó throw thì nó là ngôn ngữ ngu học cho mấy thằng ngu kiếm tiền chứ có phải ngôn ngữ được ca tụng là logic đâu
thằng java thì chúa hack rồi. Generic đéo có nên nó hack treo đầu dê generic thực chất chỉ là thịt chó đa hình nên chậm vl, vd chỉ có thằng ngu mới xài ArrayList<Int>. Đéo có lambda expression nên cũng phải hack làm cái Runnable interface. Đéo có keyword nodiscard nên chắc cũng phải hack kiểu ép xử lý lỗi bằng ngoại lệ. Thay vì update language thêm feature thì sợ fuk tạp ko dám add, nên toàn xài hack ko chứ logic mẹ gì. Sau này cũng phải ăn lại cứt mình ỉa ra thêm mấy feature mới vào rồi.
Haha, nghe 1 a vozer bỉ bôi Java tôi cứ thấy thế nào ấy :p
 
Thêm 1 cái custom middleware chuyên xử lý exception. Mục đích là để bắn ra được các exception “chung chung”. Còn lại khi code thì có 1 số exception bắn theo business rule thì code cho nó.
Đây là pratice mà mình biết đến thời điểm hiện tại
 
ý em là
Java:
class UserService {
    public User getUserInfo(int id) {
        // logic
        if (...) {
             throw UserNotFoundException("user not found");
        }

    }
}

Java:
class UserHttpController {
    private UserService userService;

    @GetMapping("/users/{id}")
    public Response<User> getUser(@RequestParam int id) {
 try {
    User user = userService.getUser(id);
    return Response(Http.Ok, ...);
 } catch (UserNotFound e) {
    return Response(Http.NotFound, ...);

 } catch (Exception e) {
    return Response(Http.Internal, ...);
   }
}

}

hay là các bác dùng kiểu gì khác kiểu này để tối ưu code hơn vậy
spring có cái exception handling mà?
 
đương nhiên là ko bất ngờ. Nó là lỗi liên quan trực tiếp tới việc open file thì sao gọi là bất ngờ được??
thằng Java nó throw thì nó là ngôn ngữ ngu học cho mấy thằng ngu kiếm tiền chứ có phải ngôn ngữ được ca tụng là logic đâu
thằng java thì chúa hack rồi. Generic đéo có nên nó hack treo đầu dê generic thực chất chỉ là thịt chó đa hình nên chậm vl, vd chỉ có thằng ngu mới xài ArrayList<Int>. Đéo có lambda expression nên cũng phải hack làm cái Runnable interface. Đéo có keyword nodiscard nên chắc cũng phải hack kiểu ép xử lý lỗi bằng ngoại lệ. Thay vì update language thêm feature thì sợ fuk tạp ko dám add, nên toàn xài hack ko chứ logic mẹ gì. Sau này cũng phải ăn lại cứt mình ỉa ra thêm mấy feature mới vào rồi.
nói nghe ngu bỏ mẹ, ignore thôi.
á đù âm react
 
Em hay làm như này. Tạo một custom exception class extend Exception class của Java, sau đó global handle trả ra client luôn như này
1690782353246.png


Hay là làm theo kiểu check if-else như này các bác
1690782482380.png
 
đương nhiên là ko bất ngờ. Nó là lỗi liên quan trực tiếp tới việc open file thì sao gọi là bất ngờ được??
thằng Java nó throw thì nó là ngôn ngữ ngu học cho mấy thằng ngu kiếm tiền chứ có phải ngôn ngữ được ca tụng là logic đâu
thằng java thì chúa hack rồi. Generic đéo có nên nó hack treo đầu dê generic thực chất chỉ là thịt chó đa hình nên chậm vl, vd chỉ có thằng ngu mới xài ArrayList<Int>. Đéo có lambda expression nên cũng phải hack làm cái Runnable interface. Đéo có keyword nodiscard nên chắc cũng phải hack kiểu ép xử lý lỗi bằng ngoại lệ. Thay vì update language thêm feature thì sợ fuk tạp ko dám add, nên toàn xài hack ko chứ logic mẹ gì. Sau này cũng phải ăn lại cứt mình ỉa ra thêm mấy feature mới vào rồi.
:whistle: em không phản đối hoàn toàn ý kiến nhưng thực tế là chỉ có Go với Rust là 2 thằng có cơ chế xử lý lỗi k dùng exception thì phải
 

Thống kê chủ đề

Ngày tạo
Lập Trình Viên Trẻ,
Người trả lời cuối
nchhnchh,
Trả lời
85
Lượt xem
16.459
Quay lại
Lên đầu trang