Setelah bertahun-tahun pengalaman bekerja dengan php dan js, saya terbiasa memiliki jejak stack di kesalahan dan melihat tempat di mana kesalahan terjadi langsung dari laporan kesalahan. Reseeding on Go beberapa tahun yang lalu, saya agak terkejut bahwa Go memiliki aturan yang berbeda dan Anda perlu menebak jejak stack pada beberapa baris seperti `karakter tidak valid`. Dan jika itu terjadi pada dorongan dan tidak diketahui bagaimana memperbanyaknya, maka ini berubah menjadi daya tarik keseluruhan.
Karena saya yakin tidak ada yang menderita karena ini, saya membuat paket yang dapat melakukan ini:

→
GitHubYang dia lakukan adalah:
- Menambahkan tumpukan jejak ke kesalahan.
- Menampilkan jejak tumpukan dan fragmen sumber tempat kesalahan ini terjadi (di hadapan sumber, tentu saja).
Menambahkan jejak tumpukan
Ada beberapa cara untuk membuat bug dengan jejak stack:
Ketika kesalahan dibungkus kembali, jejak tumpukan akan tetap sama dan tidak akan ditimpa, ini nyaman jika tidak diketahui apakah kesalahan sudah memiliki jejak tumpukan atau tidak.
Kode mungkin terlihat seperti ini:
func decodeFile(path string, data interface{}) error { b, err := ioutil.ReadFile(path) if err != nil { return tracerr.Wrap(err) } err = json.Unmarshal(b, data)
Tampilan jejak tumpukan
Setelah kesalahan hingga 100500
if err != nil { return err }
kembali ke Homeland Anda di
main()
(atau di mana diproses), kemungkinan besar Anda ingin menampilkan atau menjanjikannya.
Ada beberapa opsi untuk ini: semua berfungsi sebagai Cetak (cetak teks) atau Sprint (pengembalian teks):
1) Menampilkan teks kesalahan dan jejak stack:
tracerr.Print(err)
2) Tampilkan teks kesalahan, jejak tumpukan dan fragmen sumber (6 baris secara default):
tracerr.PrintSource(err)
3) Sama, tetapi dalam warna, biasanya lebih informatif:
tracerr.PrintSourceColor(err)
4) Anda dapat memberikan sebagai parameter berapa banyak baris kode untuk ditampilkan:
tracerr.PrintSource(err, 9) tracerr.PrintSourceColor(err, 9)
5) Atau lulus 2 parameter opsional, berapa banyak sebelum dan berapa banyak setelah baris dengan kesalahan untuk ditampilkan:
tracerr.PrintSource(err, 5, 2) tracerr.PrintSourceColor(err, 5, 2)
Pertanyaan
Saya sudah menerima beberapa umpan balik, jadi saya membiarkan diri saya menjawab sebelumnya beberapa pertanyaan yang sudah diajukan.
T: Apakah ini hanya cocok untuk debug? Ada debugger.A: Ini cocok tidak hanya untuk debugging, dimungkinkan untuk mencatat kesalahan dengan informasi tentang jejak stack, dan bahkan dengan fragmen kode sumber, pada prod, seperti dalam pengalaman saya, ini akan sangat menyederhanakan kemudian menganalisis kesalahan ini.
T: Ada paket super pkg / kesalahan, mengapa tidak menggunakannya?A: Ya, saya sendiri menggunakannya sepenuhnya dan senang, tetapi itu tidak cocok untuk saya karena alasan ini:
1) Tidak ada cara mudah untuk menampilkan jejak tumpukan segera dengan sumbernya.
2) Ketika kesalahan dibungkus kembali (misalnya, satu tingkat lebih tinggi), jejak tumpukan ditimpa oleh yang kurang informatif.
3) Sangat penting untuk mengirim teks kesalahan tambahan dengan setiap belokan, yang menurut saya menjadi overhead saat menulis / membaca kode.
T: In Go, kesalahan bukan pengecualian dan Anda tidak bisa melakukan ini sama sekali.A: Saya setuju, tidak ada kesalahan dalam Go. Jika Anda lebih suka memproses ribuan
if err != nil { return err }
dengan cara lain - tentu saja ini adalah pilihan Anda. Anda hanya dapat membungkus kesalahan yang Anda tangani sebagai pengecualian.
T: Stectrace menambahkan overhead ke kinerja.A: Ya, ia menambahkan, tetapi ini hanya relevan untuk tempat-tempat di mana kesalahan dibuat dalam jumlah besar, hanya saja jangan menambahkan jejak tumpukan di sana jika itu sangat penting (saya yakin bahwa dalam kebanyakan kasus, overhead ini dapat diabaikan).
Secara umum, saya berharap paket ini akan membuat hidup goffer Anda sedikit lebih mudah, saya akan senang dengan umpan balik, terima kasih.