-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Đừng ép tôi phải bắt!
Trong Java có hai loại exception, 1 loại thừa kế trực tiếp từ Exception
, và một loại thừa kế từ RuntimeException
, loại thừa kế từ Exception yêu cầu chúng ta phải catch
hoặc re-throws
ngay trong giai đoạn code nếu không IDE
sẽ báo lỗi compile, còn loại thừa kế từ RuntimeException
thì không.
Những tưởng câu chuyện này chẳng có gì, nhưng hoá ra nó lại tạo ra rất nhiều tranh cãi rằng là nên dùng cái nào, vậy nên mình muốn có một bài chia sẻ quan điểm của mình về việc này nhé.
Các lĩnh vực sử dụng
Có 2 lĩnh vực mà chúng ta sẽ cần quan tâm, đó là lĩnh vực viết thư viện và lĩnh vực viết ứng dụng.
Lĩnh vực viết thư viện
Đối với lĩnh vực viết thư viện: như mình đang làm đây chẳng hạn thì có rất nhiều loại Exception phải bắt vì mình dùng rất nhiều reflection
, ví dụ: ClassNotFoundException
, NoSuchMethodException
, IllegalAccessException
, ExceptionInInitializerError
. Câu hỏi đặt ra là phải làm gì với những Exception này? Một ví dụ thực tế là khi khởi tạo 1 bean, mình phải dùng reflection thế này:
Object bean = beanClass.newInstance();
Mình sẽ có 4 lựa chọn
- Catch Exception và log ra lỗi: cái này không ổn, vì là viết thư viện nên mình phải hạn chế dùng các thư viện ngoài nên ở đây mình sẽ không có đối tượng logger, không thể dùng System.out vì nó sẽ in ra console, và khi deploy rất có thể nó sẽ không in ra file và chúng ta sẽ không biết lỗi là gì
- Trả về giá trị
null
: cái này không ổn vì nếu có lỗi xảy ra, người sử dụng thư viện sẽ bịNullPointerException
và họ sẽ không hiểu tại sao - Re-throw tất cả các Exception: cái này không ổn, vì người dùng thư viện sẽ không hiểu được tại sao lại ném ra và phải làm gì với các Exception này, họ sẽ thấy thư viện này quá phức tạp và không muốn dùng hoặc họ sẽ làm thêm 1 bước nữa là #wrap lại để làm gì đó với các Exception, và điều này làm tốn thời gian, công sức của họ
- Wrap lại Exception và ném ra RuntimeException: Hợp lý bởi vì rất hiếm khi xảy ra Exception trong trường hợp này, và trong trường hợp có lỗi cũng sẽ có đủ thông tin để chúng ta debug
try {
Object bean = beanClass.newInstance();
}
catch(Exception e) {
throw new RuntimeException("can not create bean of: " + beanClass);
}
Lĩnh vực viết ứng dụng
Đối với lĩnh vực viết ứng dụng: như chúng ta vẫn đang làm. Giả sử chúng ta tổ chức source code thành 3 tầng:
- Repository: truy xuất cơ sở dữ liệu
- Service: Xử lý dữ liệu
- Controller: Tiếp nhận request và trả lại response
Và code của chúng ta thế này:
class UserRepository {
public User findUserByName(String username) throws SQLException, IOException;
}
class UserService {
public User getUser(String username) throws SQLException, IOException;
}
Đến tầng controller chúng ta sẽ có 2 lựa chọn:
- Xử lý Exception: không hợp lý, bởi vì đây chỉ là một nghiệp vụ lấy thông tin User theo name, còn rất nhiều nghiệp vụ khác thì sao, nó sẽ khiến source code của chúng ta rất dài, phức tạp và đội chi phí unitest
class UserController {
public UserResponse getUser(String username) {
try {
return new UserResponse(userService.getUser(username));
}
catch(IOException e) {
}
catch(SQLException e) {
}
}
}
- Re-throws Exception và tạo ra lớp xử lý Exception tập trung: hợp lý và thường chúng ta sẽ làm vậy, vì rốt cuộc chúng ta cũng chẳng thể biết chúng ta cần làm gì với những Exception này vì nó không liên quan đến người dùng. Tuy nhiên câu hỏi đặt ra là tại sao chúng ta không sử dụng RuntimeException ngay ở tầng repository để đỡ phải ném đi ném lại giữa các tầng? Đúng vậy, chúng ta hãy làm như vậy để source code trở lên ngắn gọn và clean hơn nhé.
class UserRepository {
public User findUserByName(String username);
}
}
class UserService {
public User getUser(String username);
}
class UserController {
public UserResponse getUser(String username);
}
@ControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity handleRuntimeException(RuntimeException e) {
Throwable cause = e.getCause();
if(cause == null) {
// trả về kết quả
}
else if(cause instanceof IOException) {
// trả về kết quả
}
else if(cause instanceof SQLException) {
// trả về kết quả
}
else {
// trả về kết quả
}
}
}
Lập trình qua nhiều ngôn ngữ như CSharp và framework như Spring hay apache thì đa phần đều sử dụng RuntimeException, nghĩa là không ép chúng ta phải bắt Exception, và gần đây nhất thì Kotlin ra đời và đã keep silent tất cả các Exception của Java, và đó cũng là một trong những lý do mà mình rất thích ở kotlin
Kết luận
Theo quan điểm của mình, chúng ta hãy nên sử dụng dạng RuntimeException và xử lý Exception tập trung ở một nơi nào đó. Hiện nay các framework như Spring đều hỗ trợ việc xử lý Exception tập trung, điều này rất tiện lợi, hãy tận dụng sức mạnh này để tiết kiệm thời gian và công sức cho mình nhé, 🙂
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội