Lompat ke konten
dokumentasi.id
Commit a5cb8ad
v2
Star20 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

11

Penanganan Error dan Interupsi

GhostTR.py tidak memakai satu penangkap galat global. Ada tiga fungsi yang membuka blok try: execute_option, main, dan TrackLu, ditambah satu blok di if __name__ == '__main__'. Setiap blok menutup galatnya sendiri, dan pesan yang dicetak berbeda-beda menurut letak kegagalannya GhostTR.py:230-242 GhostTR.py:296-306 GhostTR.py:121-124 GhostTR.py:309-315

Peta penangkap galat

Cakupan penanganan galat tidak merata. TrackLu adalah satu-satunya handler menu yang membungkus badannya dengan try, sedangkan IP_Track, phoneGW, dan showIP dibiarkan terbuka GhostTR.py:40-41 GhostTR.py:80-81 GhostTR.py:169-170. Dekorator is_option juga hanya memanggil run_banner() lalu fungsi aslinya, tanpa try, sehingga galat dari handler lewat begitu saja ke pemanggilnya GhostTR.py:30-36. Pembahasan dekorator itu ada di Banner dan Dekorator is_option.

graph TD
    Handler["option['func']()"] --> IP_Track
    Handler --> phoneGW
    Handler --> showIP
    Handler --> TrackLu
    IP_Track --> Crash["traceback ke interpreter"]
    phoneGW --> Crash
    showIP --> Crash
    TrackLu --> Caught["except Exception as e"]
    Caught --> Msg["Error : {e} lalu return"]
    style Crash fill:#dc2626,color:#fff
    style Caught fill:#2d7d46,color:#fff
    style Msg fill:#2d7d46,color:#fff
    style Handler fill:#f59e0b,color:#000
    style IP_Track fill:#f59e0b,color:#000
    style phoneGW fill:#f59e0b,color:#000
    style showIP fill:#f59e0b,color:#000
    style TrackLu fill:#2d7d46,color:#fff
%% fig: Cakupan penangkap galat per handler menu
%% desc: Hanya TrackLu yang membungkus badannya dengan try, tiga handler lain membiarkan galat naik sebagai traceback.
Fig. 1: Cakupan penangkap galat per handler menuHanya TrackLu yang membungkus badannya dengan try, tiga handler lain membiarkan galat naik sebagai traceback.

Status yang dilalui saat menu gagal

execute_option menangkap ValueError dari seluruh isi try, termasuk panggilan call_option(opt) dan sesudahnya. Cabang itu mencetak objek galat dengan print(e), menunggu time.sleep(2), lalu memanggil execute_option(opt) lagi dengan opsi yang sama GhostTR.py:230-242. Nilai ValueError sendiri berasal dari call_option, yang melempar raise ValueError('Option not found') ketika is_in_options(opt) mengembalikan False GhostTR.py:219-221.

Di sisi lain, main hanya membungkus int(input(...)) dan pemanggilan execute_option(opt). Bila pengguna mengetik bukan angka, cabang except ValueError mencetak Please input number, menunggu dua detik, lalu memanggil main() lagi GhostTR.py:296-306.

stateDiagram-v2
    [*] --> MenuInput
    MenuInput --> CallOption: int() sukses
    MenuInput --> InvalidNumber: ValueError
    InvalidNumber --> MenuInput: "Please input number" lalu main()
    CallOption --> OptionNotFound: "Option not found"
    OptionNotFound --> CallOption: print(e) lalu execute_option(opt)
    CallOption --> Handler: "option['func']()"
    Handler --> MenuInput: "Press enter to continue" lalu main()
    Handler --> HandlerError: TrackLu except Exception
    HandlerError --> MenuInput: "Error : {e}" lalu return
    CallOption --> Terminated: KeyboardInterrupt
    Terminated --> [*]
    style MenuInput fill:#f59e0b,color:#000
    style CallOption fill:#336791,color:#fff
    style Handler fill:#2d7d46,color:#fff
    style InvalidNumber fill:#dc2626,color:#fff
    style OptionNotFound fill:#dc2626,color:#fff
    style HandlerError fill:#8b5cf6,color:#fff
    style Terminated fill:#dc2626,color:#fff
%% fig: Perpindahan status menu saat galat dan retry
%% desc: Input bukan angka kembali ke MenuInput, opsi tak dikenal mengulang CallOption, dan Ctrl+C mengakhiri program lewat Terminated.
Fig. 2: Perpindahan status menu saat galat dan retryInput bukan angka kembali ke MenuInput, opsi tak dikenal mengulang CallOption, dan Ctrl+C mengakhiri program lewat Terminated.

Jalur sukses tetap berakhir di MenuInput karena execute_option mencetak Press enter to continue lalu memanggil main() lagi dari dalam blok try GhostTR.py:233-234. Rincian urutan pemanggilan antar fungsi ada di Alur Eksekusi Menu dan Validasi Opsi dan Loop Menu.

Dua jalur KeyboardInterrupt

KeyboardInterrupt tidak selalu ditangkap di tempat yang sama. Bila Ctrl+C ditekan saat int(input(...)) di main, galat itu lolos dari main karena cabangnya hanya except ValueError, lalu berhenti di blok __main__ yang mencetak Exit, menunggu dua detik, dan memanggil exit() GhostTR.py:309-315. Bila Ctrl+C terjadi setelah execute_option berjalan, misalnya pada Press enter to continue atau di dalam handler, penangkap di execute_option yang menanganinya dengan cetakan dan jeda yang sama GhostTR.py:230-242.

sequenceDiagram
    participant G as __main__ guard
    participant M as main
    participant E as execute_option
    participant U as User
    G->>M: main()
    U->>M: Ctrl+C pada int(input(...))
    M->>G: KeyboardInterrupt lolos, hanya ValueError ditangkap
    G->>U: "[ ! ] Exit" lalu exit()
    G->>M: main()
    M->>E: execute_option(opt)
    U->>E: Ctrl+C pada "Press enter to continue"
    E->>U: "[ ! ] Exit" lalu exit()
%% fig: Dua jalur KeyboardInterrupt
%% desc: Ctrl+C di pembacaan opsi lolos ke blok __main__, sedangkan Ctrl+C setelah dispatch ditangkap execute_option.
Fig. 3: Dua jalur KeyboardInterruptCtrl+C di pembacaan opsi lolos ke blok __main__, sedangkan Ctrl+C setelah dispatch ditangkap execute_option.

TrackLu tidak menangkap interupsi. Blok except Exception as e hanya menerima turunan Exception, sedangkan KeyboardInterrupt adalah turunan BaseException, sehingga Ctrl+C di tengah pelacakan username tetap sampai ke execute_option GhostTR.py:159-161.

Pesan galat dan kelanjutannya

Setiap penangkap mencetak string berbeda dan meneruskan kendali dengan cara berbeda pula.

PemicuLokasi penangkapString yang dicetakKelanjutan
Opsi tidak ada di optionscall_optionOption not foundprint(e), time.sleep(2), execute_option(opt) GhostTR.py:219-221
Input menu bukan angkamainPlease input numbertime.sleep(2), main() GhostTR.py:296-306
Galat apa pun di TrackLuTrackLuError : {e}return, lalu execute_option lanjut ke Press enter to continue GhostTR.py:159-161
Ctrl+C saat dispatchexecute_optionExittime.sleep(2), exit() GhostTR.py:230-242
Ctrl+C saat membaca opsiblok __main__Exittime.sleep(2), exit() GhostTR.py:309-315
Opsi tanpa kunci funccall_optionNo function detectedlanjut ke Press enter to continue GhostTR.py:222-227

Baris terakhir tabel tidak pernah terpicu dengan daftar options saat ini, karena kelima entri menu semuanya memuat func GhostTR.py:222-227.

Jebakan yang perlu diketahui

⚠️ Kedua cabang retry memakai rekursi, bukan while. main() di except ValueError pada main dan execute_option(opt) di except ValueError pada execute_option menambah satu frame setiap percobaan, dan berkas ini tidak menyimpan penghitung percobaan GhostTR.py:296-306 GhostTR.py:230-242.

⚠️ Cabang except ValueError di execute_option juga menangkap ValueError yang lahir dari dalam handler, bukan hanya dari call_option. Contohnya konversi int(ip_data['latitude']) dan int(ip_data['longitude']) di IP_Track, yang berada di jalur option['func'](). Bila konversi itu gagal, pesan galat mentah dari Python dicetak dan opsi yang sama dijalankan ulang tanpa menggambar ulang menu GhostTR.py:59-60 GhostTR.py:230-242.

⚠️ TrackLu menelan semua Exception menjadi satu baris Error : {e} lalu return. Tidak ada logging dan tidak ada detail situs mana yang gagal, sehingga pada praktiknya kegagalan jaringan di tengah 24 URL berhenti sebagai satu baris pesan GhostTR.py:159-161. Perilaku pelacakan yang dibungkusnya dijelaskan di Username Tracker.

Handler IP_Track, phoneGW, dan showIP tidak memiliki penangkap sama sekali, sehingga galat KeyError pada pembacaan kunci JSON atau NumberParseException dari phonenumbers naik sebagai traceback dan menghentikan program GhostTR.py:40-41 GhostTR.py:80-81 GhostTR.py:169-170. Topik tiap handler itu dibahas di IP Tracker, Phone Number Tracker, dan Show Your IP.