Error handling with return codes · Penanganan kesalahan dengan kode pengembalian
C has no try/except
- Some languages throw exceptions when something goes wrong. C does not have exceptions.
- Instead, a C function reports trouble through its return value — a status code.
- The caller checks that code after every call and decides what to do.
C tidak memiliki try/except
- Beberapa bahasa melempar pengecualian ketika terjadi kesalahan. C tidak memiliki pengecualian.
- Sebaliknya, fungsi C melaporkan masalah melalui nilai kembalinya — kode status.
- Pemanggil memeriksa kode tersebut setelah setiap panggilan dan memutuskan apa yang harus dilakukan.
Return a status code
- A common rule: return
0for success and a negative number like-1for failure. - So
int do_thing(...)returns0when it worked,-1when it could not. - The real "answer" is then handed back a different way (see the next step).
Mengembalikan kode status
- Aturan umum: kembalikan
0untuk sukses dan bilangan negatif seperti-1untuk gagal. - Jadi
int do_thing(...)mengembalikan0jika berhasil,-1jika tidak bisa. - "Jawaban" sebenarnya kemudian dikembalikan dengan cara lain (lihat langkah berikutnya).
Reporting the answer through an out-pointer
- If the return value is a status code, where does the real result go? Through an out-pointer.
- The caller passes the address of a variable; the function writes the answer with
*. - On failure, the function returns
-1and simply leaves that variable alone.
Melaporkan jawaban melalui out-pointer
- Jika nilai kembalinya adalah kode status, ke manakah hasil aslinya pergi? Melalui out-pointer.
- Pemanggil meneruskan alamat variabel; fungsi menulis jawabannya menggunakan
*. - Pada kegagalan, fungsi mengembalikan
-1dan hanya membiarkan variabel tersebut tetap tidak berubah.
Sentinels for "no value"
- A sentinel is a special value that means "nothing here":
-1for an index,NULLfor a pointer. - Functions use sentinels so the caller can tell success from failure with a simple check.
- Always check for the sentinel before you trust the result.
Sentinel untuk "tidak ada nilai"
- Sebuah sentinel adalah nilai khusus yang berarti "tidak ada di sini":
-1untuk indeks,NULLuntuk pointer. - Fungsi menggunakan sentinel agar pemanggil dapat membedakan keberhasilan dari kegagalan dengan pemeriksaan sederhana.
- Selalu periksa adanya sentinel sebelum Anda percaya pada hasilnya.
#include <stdio.h>
int safe_div(int a, int b, int *result) {
if (b == 0) return -1; // failure: cannot divide by zero
*result = a / b; // success: hand back the answer
return 0;
}
int main(void) {
int r;
if (safe_div(10, 2, &r) == 0) {
printf("%d\n", r); // 5
}
return 0;
}
Common mistakes
- Return a non-zero code from
mainto signal an error. - Check the return value of any function that can fail.
Kesalahan umum
- Kembalikan kode bukan nol dari
mainuntuk menandakan kesalahan. - Periksa nilai kembalian dari setiap fungsi yang dapat gagal.
Now you try
- Return
0on success and-1on failure, and write the real answer through the out-pointer. - On failure, do not touch the out-pointer. Do not write a
main— the checker provides one.
Sekarang Anda coba
- Kembalikan
0pada keberhasilan dan-1pada kegagalan, lalu tulis jawaban sebenarnya melalui out-pointer. - Pada kegagalan, jangan sentuh out-pointer. Jangan tulis
main— pemeriksa akan menyediakan satu.
Complete int safe_div(int a, int b, int *result): if b is 0, return -1 and leave *result alone. Otherwise store a / b in *result and return 0. Do not write a main. · Lengkapi int safe_div(int a, int b, int *result): jika b adalah 0, kembalikan -1 dan biarkan *result apa adanya. Sebaliknya simpan a / b di *result dan kembalikan 0. Jangan tulis sebuah main.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Complete int parse_int(const char *s, int *out): if s is a valid integer (digits, with an optional leading -), store its value in *out and return 0; otherwise return -1. Do not write a main. · Lengkapi int parse_int(const char *s, int *out): jika s adalah bilangan bulat valid (digit, dengan optional tanda - di awal), simpan nilainya dalam *out dan kembalikan 0; sebaliknya kembalikan -1. Jangan tulis loop main.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Complete int withdraw(int balance, int amount, int *new_balance): if amount is more than balance, return -1. Otherwise set *new_balance to balance - amount and return 0. Do not write a main. · Lengkapi int withdraw(int balance, int amount, int *new_balance): jika amount lebih besar dari balance, kembalikan -1. Jika tidak, tetapkan *new_balance ke balance - amount dan kembalikan 0. Jangan tulis sebuah main.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.