Error? Handle Aja~

Cindy Adelia
temancatat
Published in
5 min readMay 15, 2018

Overview

Halo semua, minggu ini adalah minggu terakhir individual review PPL. Sekarang saya mau ngelanjutin pembahasan tentang post saya sebelumnya error code. Setelah kemarin bahas error code, belum lengkap kalau readers belum kenalan sama yang namanya error dan exception handling. Jadi, mungkin kita kembali mengingat pelajaran dasar pemrograman mengenai jenis -jenis error. Secara umum, terdapat 3 jenis error, yaitu syntax error, runtime error, dan logic error. Syntax error adalah error yang disebabkan kesalahan pada aturan penggunaan sintaks bahasa pemrograman, misalnya di Java, kita lupa memberikan tipe pada suatu variable, compiler akan memberi tahu bahwa ada kesalahan sintaks dalam hal ini grammar dari Java meminta agar deklarasi variable didefinisikan tipenya. Program yang terbebas dari syntax error dan bisa di run, bisa saja tiba-tiba exit atau crashed secara tidak terduga ketika program menemui yang namanya runtime error. Tapi ada juga program yang jalan baik-baik saja, tidak crashed, tapi memberikan hasil yang tidak sesuai ekspektasi. Hal tersebut disebut sebagai logic error. Sesuai namanya, logic programnya yang salah, mungkin si programmer udah mulai pusing pas ngoding ya :(.

Nah, dari ketiga error itu, syntax error terjadi sebelum program dijalankan, compiler sudah canggih buat kasih tau dimana sih letak kesalahan sintaksnya, jadi kita ga perlu pusing nyari syntax errornya dimana. Untuk logic error memang sulit dideteksi, itulah sebabnya penting bagi kita membuat tes untuk mengecek logic dari program kita. Nah kalau buat runtime error gimana ngatasinnya? Gamau kan user tiba-tiba marah-marah karena programnya tiba-tiba error pas lagi jalan, ga ada pemberitahuan ataupun kejelasan. Cari solusi? Disini tempatnya!

Exception Handling

Untuk aplikasi yang interaktif seperti TemanCatat, kita tidak bisa mengasumsikan bahwa user pasti memberikan masukan yang tepat bagi program kita ataupun seluruh komponen pada program kita pasti berjalan semuanya. Bisa saja user memberikan input yang invalid pada sebuah form. Bisa juga, ketika program kita ingin me-retrieve data dari database, database-nya sedang bermasalah dan program kita gagal untuk menampilkan data ke user. Dalam Java, expected error seperti ini dikenal sebagai exception.
Nah, daripada membiarkan program kita crash begitu saja karena terkena exception, kita dapat menerapkan teknik yang bernama exception handling. Caranya tidak sulit, cukup tangkap exception di bagian-bagian program yang kita tahu dapat menimbulkan error, lalu handle exception tersebut sesuai dengan keinginan. Selain mudah, teknik ini membuat kode kita lebih simple dan readable dibandingkan menggunakan error check.

Contoh pengunaan error check

Object input;
input = in.readLine();
if(input instanceof Integer) {
Integer integer = (Integer) object;
} else {
System.out.println(“input is not integer”);
}

Contoh penggunaan exception handling

int input;
try {
input = Integer.parseInt(in.readLine());
} catch(Exception e) {
System.out.println(“input is not integer”);
}

Telihat bahwa untuk error check, kita lebih repot untuk melakukan casting object ke integer dan mendefinisikan input sebagai Object dulu. Cara koding seperti ini kurang readable dibandingkan dengan exception handling. Dengan menggunakan exception handling kita dapat langsung mendeklarasikan input sebagai int. Orang lain yang mungkin saja melanjutkan kodingan kita akan lebih mudah memahami makna dari variable-variable yang ada pada kode kita. Jadi pilih mana? Terserah readers sih pada akhirnya, tapi maunya kode kita clean dan elegant kan? Jadi, saya lanjutin bahas penerapan exception handling saja ya di aplikasi TemanCatat.

Exception Handling in TemanCatat

TemanCatat adalah suatu aplikasi Android untuk inventory tracking. Di dalamnya, terdapat pencatatan transaksi masuk dan keluar. User dapat melihat transaksi, memasukkan transaksi, mengubah transaksi, dan menghapus transaksi. Kegiatan memasukkan, mengubah, dan menghapus transaksi diatur pada satu activity, yaitu AddTransactionActivity. Di sini, user akan disajikan form sebagai berikut.

Dalam melakukan pengisian form, user bisa saja memasukkan input-input yang invalid baik secara sadar maupun tidak sadar. Misalnya, barang tidak dipilih, stok diisi 0, dan harga negatif. Logic pengecekan validasi form ini dilakukan di presenter AddTransactionPresenter. Fungsi pengecekan utamanya adalah sebagai berikut.

public void onSaveTransaction(String productSKU, Date date, ProductStockRecord.TransactionType transactionType, Integer inputStocks, Double price) throws AppException {
boolean hasError = false;
if(productSKU == null) {
getView().setInvalidProductError();
hasError = true;
}
if(inputStocks == null || inputStocks < 1) {
getView().setInvalidAmountError();
hasError = true;
}
if(price == null || price < 0.0) {
getView().setInvalidPriceError();
hasError = true;
}
if(hasError) {
throw new AppException(Error.USER_INVALID_INPUT);
}
Product product = getRealmDataManager()
.getProductBySKU(productSKU);
ProductStockRecord record = null;
if(transactionType
.equals(ProductStockRecord.TransactionType.TRANSACTION_OUT)) {
int currentStocks = getRealmDataManager()
.getCurrentProductStockByProductSKU(productSKU);
if(currentStocks < inputStocks) {
getView().setNotEnoughStockError(currentStocks);
throw new AppException(Error.USER_INVALID_INPUT);
}
}
record = new ProductStockRecord(product, date,
transactionType, inputStocks, price);
}
getView().onLoading();
getRealmDataManager().createOrUpdateProductStockRecord(record,
this);
}

Pertama-tama, fungsi ini akan mengecek apakah barang sudah dipilih, input > 0, dan harga >= 0. Jika salah satu kondisi ini tidak terpenuhi, maka lempar Exception untuk USER_INVALID_INPUT error. Untuk penambahan transaksi baru, lakukan pengecekan lagi. Jika stok yang ditambahkan untuk transaksi keluar lebih dari stok dari transaksi masuk, maka lempar Exception untuk USER_INVALID_INPUT error. Untuk definisi lebih lanjut tentang error code beserta messagenya, dapat dilihat pada wiki repository project kami mengenai error code disini.

Sekarang, waktunya kita handling exception (YAY). Handling exception dari presenter di atas dilakukan pada AddTransactionActivity. Dalam menghandle exception, kita perlu menangkap exception yang telah dilempar, dalam kasus ini ketika presenter memanggil method onSaveTransaction, maka kita tangkap jika ada exception pada bagian catch. Handling exception untuk memberikan pesan error dilakukan pada bagian catch sebagai berikut.

public void saveTransactionButtonClick() {
Date date = getTransactionDate();
Integer stock = getStockAmount();
Double priceAmount = getPrice();
try {
mPresenter.onSaveTransaction(currentProductSKU, date,
transactionType, stock, priceAmount);
} catch(AppException e) {
showErrorMessage(e.getMessage());
}
}

Dengan mudahnya, pada kode ini kita hanya perlu memanggil method showErrorMessage(e.getMessage()) karena kita telah mendefinisikan berbagai error dan membungkusnya pada AppException. Jika kita menggunakan error check, maka kita perlu mendefinisikan satu per satu error dan pesan error yang akan ditampilkan. Bayangkan jika terdapat beberapa method yang melakukan exception handling, kodenya akan jadi lebih panjang dan redundan.

Berikut adalah contoh tampilan jika terjadi error pada kesalahan input. Setiap field akan diberikan error message yang bersesuaian dari resource. Pada snackbar akan muncul error message “Terjadi kesalahan input” yang bersesuaian dengan USER_INVALID_INPUT error.

Penutup

Nah, begitulah cara melakukan exception handling. Tidak sulit kan? Simple dan Clean, kayak judul lagu. Jadi kesimpulannya, exception handling ini penting untuk mengatasi runtime error dengan mudah dan tetap menjaga readabilitas kode kita. Semoga sekarang readers bisa membuat aplikasi yang ga gampang crash ya agar user kalian betah pakai aplikasi kalian. Selamat mencoba :)

--

--