Error Handling dalam Swift


Fitur Error Handling dalam Swift sudah ada sejak Swift 2.0 yang memungkinkan Kamu untuk menulis kode yang lebih bersih, modular, dan mudah dibaca.

Sebelum memulai apa saja sih permasalahan yang kita jumpai dalam Error Handling.

  • Bagaimana Kamu memperingatkan rekan kerja Kamu bahwa fungsi tersebut dapat menghasilkan hasil yang tidak terduga?
  • Apa itu blok do-try ?
  • Bagaimana kita dapat membedakan antara try?, try dan try!?

Pemeriksaan keamanan dengan else-if

Desain pemeriksaan keamanan untuk pengendara berdasarkan ketinggian. Jika penumpang lebih tinggi dari 2m atau di bawah 1,4m, program akan mengirim pesan kesalahan bersama dengan instruksi lainnya.

func checkHeight(height: Int) {
	if height > 200 {
		print("You are going to hit your head and fall off")
		// Take him/her off from the ride
		// Code ...
		// Seatbelt tighten
	} else if height < 140 {
		print("You might fly in the air")
		// Take him/her off from the ride
		// Code ...
	} else {
		print("Enjoy")
		// Take him/her to the ride
		// Code ...
	}
}

Masalah dengan else-if
1. Fungsi menjadi terlalu krodit(kembung)
2. Kurangnya modularitas
3. Ketidakpastian

Error Handling

Error Handling hanyalah alternatif lain untuk menulis pernyataan else-if, tidak hanya menangani Error tetapi juga memberikan respon di blok yang terpisah.

Design Error

Buat enum yang sesuai dengan protokol Error. Kemudian tentukan casenya.

enum HeightError: Error {
	case maxHeight
	case minHeight
}

Jenis apa pun yang menyatakan kecocokan dengan protokol ‘Error’ dapat digunakan untuk mewakili kesalahan dalam sistem penanganan kesalahan Swift. Karena protokol ‘Error’ tidak memiliki persyaratannya sendiri, Kamu dapat mendeklarasikan kesesuaian pada jenis custom apa pun yang Kamu buat.

Throwable Function

Buat fungsi yang dapat melempar / mengembalikan kesalahan dengan memasukkan throw di akhir parameter fungsi. Fungsi tidak mengandung pesan kesalahan. Harus diketahui “throw” sebuah kesalahan akan “ditangkap” dan ditangani dalam blok terpisah do-try.

func checkHeightError(height: Int) throws {
	if height > 200 {
		throw HeightError.maxHeight
	} else if height < 140 {
		throw HeightError.minHeight
	} else {
		print("Enjoy your ride")
	}
}

Call and Handle Error

Untuk memanggil fungsi yang mengandung throws, fungsi membutuhkan try di dalam blok do. Blok catch digunakan untuk mengenali error yang dilempar oleh fungsi. Jika tidak terdapat error, blok catch akan diabaikan.

do {
	try checkHeightError(height: 240)
} catch HeightError.maxHeight {
	print("Get out of here")
} catch HeightError.minHeight {
	print("Too short to ride")
}

Error Handling saat Inisialisasi Object

enum CourseError: Error {
        case noName
}

Ketika user memasukkan string kosong saat inisialisasi, fungsi init akan throws error CourseError.noName

class Course {
	var name: String

	init(name: String) throws {
		if name == "" {
			throw CourseError.noName
		} else {
			self.name = name
			print("You've created an object!")
		}
	}
}

Inisialisasi dan Handle Error

Buat objek menggunakan try di dalam blok do-catch.

do {
	let myCourse = try Course(name: "")
} catch CourseError.noName {
	print("Error: please make sure enter name!")
	// Logic
}

Membedakan antara try, try? dan try!

try hanya digunakan di dalam blok do-catch. Namun try? dan try! dapat digunakan tanpa blok do-catch.

Kamu dapat menggunakan try tanpa blok do-try di dalam Playground, tetapi itu tidak diperbolehkan di tempat lain.

try? mengembalikan tipe optional. Jika fungsi/Init mengembalikan error, maka hasilnya akan nil.

let newCourse = try? Course(name: "Bob the Dev") // returns Course?
let newDopeCourse = try? Course(name: "") // nil

try! mengembalikan tipe normal, Jika fungsi/Init mengembalikan error akan terjadi CRASH.

let myNewCourse = try! Course(name: "Bobby Lee") // ?
let myDopeNewCourse = try! Course(name: "") // CRASH

Oke sekian untuk pembahasan Error Handling dalam swift.

Semoga bermanfaat.

0 0 votes
Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

0
Would love your thoughts, please comment.x
()
x