Bài 15-Xử lý biệt lệ trong Kotlin


Tại sao phải xử lý biệt lệ?

Trong quá trình thực thi phần mềm sẽ có những lỗi phát sinh mà trong quá trình coding ta đã dự đoán hoặc chưa dự đoán được

Việc kiểm soát các biệt lệ giúp cho phần mềm tiếp tục hoạt động nếu lỗi xảy ra hoặc cũng đưa ra các gợi ý bên phía User Problem

Khi lập trình thường chúng ta gặp 3 cấp độ lỗi:

  • Lỗi biên dịch (mới học lập trình, viết đâu sai đó… rất đáng thương)
  • Lỗi runtime exception (học lập trình chưa thông, chạy lên báo lỗi om sòm)
  • Lỗi logic exception – sai nghiệp vụ yêu cầu (đã thành lập trình viên, gặp những lỗi khó sửa)

Và khi gặp lỗi thì thường có 2 hành vi với lỗi: Không quan tâm (Unchecked error) và quan tâm(Checked error)

Để hướng tới lập trình viên chuyên nghiệp thì ta cần quan tâm tới những lỗi này, phải kiểm tra cẩn thận để khi có gặp lỗi xảy ra thì chương trình vẫn tiếp tục mà không bị tắt ngang.

Kotlin hỗ trợ chúng ta cú pháp tổng quát để xử lý biệt lệ như sau:

try {

// viết lệnh ở đây và các lệnh này có khả năng sinh ra lỗi

}

catch (e: SomeException) {

// handler lỗi ở đây -> thông báo lỗi chi tiết để biết mà sửa cái gì

}

finally {

// optional finally block – cho dù có lỗi hay không có lỗi xảy ra thì block luôn luôn thực hiện

}

Ví dụ 1: Viết chương trình chia 2 số a và b. Chủ ý cho mẫu số =0 để sinh ra lỗi


fun main(args: Array) {
try {
var a:Int=5
var b:Int=0;
var c=a/b
println("$a/$b=$c")
}
catch (e:Exception)
{
println(e.message)
}
finally {
println("Đây là finally, 100% chạy, cho dù lỗi hay không")
}
}

Khi chạy đoạn lệnh ở trên thì đến dòng a/b sẽ sinh ra lỗi và nó nhảy vào exception, sau đó finally sẽ được thực hiện:

/ by zero
Đây là finally, 100% chạy, cho dù lỗi hay không

Ngoài ra Kotlin cũng hỗ trợ từ khóa throws để ném lỗi này ra nơi khác, những chỗ nào gọi nó sẽ xử lý lỗi này.

Ví dụ 2:


fun chia(a:Int,b:Int):Int
{
if(b==0)
throw Exception("Mẫu số =0")
return a/b
}
fun main(args: Array) {
chia(5,0)
println("Cám ơn!")
}

Khi chạy chương trình ở ví dụ 2 lên thì nó sẽ xuất ra thông báo lỗi: Mẫu số =0 và tắt ngang phần mềm, không cho dòng chữ “Cám ơn”có cơ hội xuất hiện. VÌ lúc này ta chưa dùng try..catch để checked error:

Exception in thread “main” java.lang.Exception: Mẫu số =0
at App_bietle_throwsKt.chia(app_bietle_throws.kt:7)
at App_bietle_throwsKt.main(app_bietle_throws.kt:11)

Ta sửa lại mã lệnh ở trên để khi có lỗi xảy ra thì chương trình vẫn tiếp tục hoạt động:

Ví dụ 3:


fun chia(a:Int,b:Int):Int
{
if(b==0)
throw Exception("Mẫu số =0")
return a/b
}
fun main(args: Array) {
try {
chia(5, 0)
}
catch (e:Exception)
{
println(e.message)
}
println("Cám ơn!")
}

Khi có try .. catch thì cho dù có lỗi xảy ra, chương trình vẫn tiếp tục thực hiện các lệnh còn lại (tránh tắt ngang phần mềm), chương trình trên khi chạy sẽ có kết quả:

Mẫu số =0
Cám ơn!

Như vậy tới đây Tui đã hướng dẫn xong xử lý biệt lệ trong Kotlin, các bạn chú ý học kỹ và hiểu được nó thông qua các ví dụ ở trên nhé. Đặc biệt nắm được cách thức vận hành của try..catch..finally…throw để có thể áp dụng tốt vào các dự án thực tế của mình.

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/ko46c0s2d476669/HocXuLyBietLe.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://ssoftinc.com/)

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.