Xử lý Exception handling là điều bắt buộc trong bất kỳ ngôn ngữ lập trình nào để xử lý các lỗi runtime để có thể duy trì luồng ứng dụng bình thường.
Exception thường làm gián đoạn luồng thông thường của ứng dụng, đó là lý do tại sao chúng ta cần sử dụng Exception handling trong ứng dụng của mình.

Exception Handling - Xử lý lỗi trong Groovy
Các Exception được phân loại thành các loại sau:
Checked Exception − Các Class kế thừa từ class Throwable (ngoại trừ RuntimeException và Error) được gọi là các checked exception. Ví dụ: IOException, SQLException, v.v. Các checked exception được kiểm tra tại thời gian biên dịch.
Một trường hợp điển hình là FileNotFoundException. Giả sử bạn có đoạn mã sau trong ứng dụng của mình, mã này đọc từ một tệp trong ổ E.
class Example {
static void main(String[] args) {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
}
}
nếu File (file.txt) không có trong ổ E thì exception sau sẽ xuất hiện.
Caught: java.io.FileNotFoundException: E:\file.txt (The system cannot find the file specified).
java.io.FileNotFoundException: E:\file.txt (The system cannot find the file specified).
Unchecked Exception − Các class kế thừa từ class RuntimeException được gọi là các unchecked exception. Ví dụ: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, v.v.
Các unchecked exception không được kiểm tra tại thời gian biên dịch thay vào đó chúng được kiểm tra trong giai đoạn runtime.
class Example {
static void main(String[] args) {
def arr = new int[3];
arr[5] = 5;
}
}
Khi đoạn mã trên được thực thi, exception sau sẽ xuất hiện.
Caught: java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 5
Error - Lỗi không thể khắc phục được, ví dụ: OutOfMemoryError, VirtualMachineError, AssertionError, v.v.
Đây là những lỗi mà chương trình không bao giờ có thể phục hồi được và sẽ khiến chương trình bị lỗi.
Sơ đồ sau đây cho thấy cách tổ chức phân cấp các exception trong Groovy. Tất cả đều dựa trên hệ thống phân cấp được xác định trong Java.

Catching Exceptions
Một phương thức bắt ngoại lệ bằng cách sử dụng kết hợp các từ khóa try và catch. Cụm try/catch được đặt xung quanh mã có thể tạo ra exeption.
try {
//Protected code
} catch(ExceptionName e1) {
//Catch block
}
Tất cả code có thể gây ra exception đều được đặt trong Protected code block.
Trong catch, bạn có thể viết code tùy biến để xử lý exeption của mình để ứng dụng có thể khôi phục từ exeption đó.
Hãy xem ví dụ về đoạn code mà chúng ta đã thấy ở trên để truy cập một mảng có giá trị chỉ mục lớn hơn kích thước của mảng. Nhưng lần này hãy đặt code của chúng ta vào khối try/catch.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Catching the exception
Let's move on after the exception
Từ đoạn mã trên, tôi đã bọc toàn bộ đoạn code trong try. Trong catch, tôi chỉ bắt exception của mình và đưa ra thông báo rằng exception đã xảy ra.
Multiple Catch Blocks
Người ta có thể có nhiều block bắt để xử lý nhiều loại exception. Đối với mỗi catch, tùy thuộc vào loại exception được nêu ra mà bạn sẽ viết code để xử lý nó cho phù hợp.
Nào ta hãy sửa đổi code trên của chúng tôi để nắm bắt cụ thể ArrayIndexOutOfBoundsException.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Catching the Aray out of Bounds exception
Let's move on after the exception
Từ đoạn mã trên, bạn có thể thấy đoạn bắt ArrayIndexOutOfBoundsException bị catch đầu tiên vì nó có nghĩa là tiêu chí của exception.
Finally Block
Block cuối cùng là finally theo sau block try hoặc catch. Nó luôn luôn được chạy ngay sau try hoặc catch, bất kể excetption có xảy ra hay không.
Việc sử dụng finally cho phép bạn chạy bất kỳ câu lệnh loại cleanup-type nào mà bạn muốn thực thi. Ví dụ đơn giản dưới đây.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
} finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Catching the Array out of Bounds exception
The final block
Let's move on after the exception
Sau đây là các Exception methods có sẵn trong Groovy -
public String getMessage()
Trả về thông báo chi tiết về exception đã xảy ra. Thông báo này được khởi tạo trong hàm tạo Throwable.
public Throwable getCause()
Trả về nguyên nhân của exception được biểu thị bằng đối tượng Throwable.
public String toString()
Returns the name of the class concatenated with the result of getMessage()
public void printStackTrace()
In kết quả của toString() cùng với stack trace tới System.err, luồng đầu ra lỗi.
public StackTraceElement [] getStackTrace()
Trả về một mảng chứa từng phần tử trên stack trace. Phần tử ở chỉ mục 0 đại diện cho phần trên cùng của call stack và phần tử cuối cùng trong mảng đại diện cho phương thức ở cuối call stack.
public Throwable fillInStackTrace()
Fills the stack trace của Throwable object này, thêm vào bất kỳ thông tin nào trước đó trong stack trace.
Ví dụ sau:
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println(ex.toString());
println(ex.getMessage());
println(ex.getStackTrace());
} catch(Exception ex) {
println("Catching the exception");
}finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
java.lang.ArrayIndexOutOfBoundsException: 5
5
[org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod$MyPojoMetaMet
hodSite.call(IntegerArrayPutAtMetaMethod.java:75),
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) ,
Example.main(Sample:8), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93),
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325),
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1443),
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:893),
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:287),
groovy.lang.GroovyShell.run(GroovyShell.java:524),
groovy.lang.GroovyShell.run(GroovyShell.java:513),
groovy.ui.GroovyMain.processOnce(GroovyMain.java:652),
groovy.ui.GroovyMain.run(GroovyMain.java:384),
groovy.ui.GroovyMain.process(GroovyMain.java:370),
groovy.ui.GroovyMain.processArgs(GroovyMain.java:129),
groovy.ui.GroovyMain.main(GroovyMain.java:109),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109),
org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)]
The final block
Let's move on after the exception
Bài tiếp theo: Bài 13 - Hướng dẫn lập trình groovy: Hướng đối tượng trong groovy
Không có nhận xét nào: