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-2421 GhostTR.py:296-3062 GhostTR.py:121-1243 GhostTR.py:309-3154
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-415 GhostTR.py:80-816 GhostTR.py:169-1707. 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-368. 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.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-2421. Nilai ValueError sendiri berasal dari call_option, yang melempar raise ValueError('Option not found') ketika is_in_options(opt) mengembalikan False GhostTR.py:219-2219.
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-3062.
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.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-23410. 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-3154. 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-2421.
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.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-16111.
Pesan galat dan kelanjutannya
Setiap penangkap mencetak string berbeda dan meneruskan kendali dengan cara berbeda pula.
| Pemicu | Lokasi penangkap | String yang dicetak | Kelanjutan |
|---|---|---|---|
Opsi tidak ada di options | call_option | Option not found | print(e), time.sleep(2), execute_option(opt) GhostTR.py:219-2219 |
| Input menu bukan angka | main | Please input number | time.sleep(2), main() GhostTR.py:296-3062 |
Galat apa pun di TrackLu | TrackLu | Error : {e} | return, lalu execute_option lanjut ke Press enter to continue GhostTR.py:159-16111 |
| Ctrl+C saat dispatch | execute_option | Exit | time.sleep(2), exit() GhostTR.py:230-2421 |
| Ctrl+C saat membaca opsi | blok __main__ | Exit | time.sleep(2), exit() GhostTR.py:309-3154 |
Opsi tanpa kunci func | call_option | No function detected | lanjut ke Press enter to continue GhostTR.py:222-22712 |
Baris terakhir tabel tidak pernah terpicu dengan daftar options saat ini, karena kelima entri menu semuanya memuat func GhostTR.py:222-22712.
Jebakan yang perlu diketahui
⚠️ Kedua cabang retry memakai rekursi, bukan
while.main()diexcept ValueErrorpadamaindanexecute_option(opt)diexcept ValueErrorpadaexecute_optionmenambah satu frame setiap percobaan, dan berkas ini tidak menyimpan penghitung percobaan GhostTR.py:296-3062 GhostTR.py:230-2421.
⚠️ Cabang
except ValueErrordiexecute_optionjuga menangkapValueErroryang lahir dari dalam handler, bukan hanya daricall_option. Contohnya konversiint(ip_data['latitude'])danint(ip_data['longitude'])diIP_Track, yang berada di jaluroption['func'](). Bila konversi itu gagal, pesan galat mentah dari Python dicetak dan opsi yang sama dijalankan ulang tanpa menggambar ulang menu GhostTR.py:59-6013 GhostTR.py:230-2421.
⚠️
TrackLumenelan semuaExceptionmenjadi satu barisError : {e}lalureturn. 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-16111. 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-415 GhostTR.py:80-816 GhostTR.py:169-1707. Topik tiap handler itu dibahas di IP Tracker, Phone Number Tracker, dan Show Your IP.