Rumah > Artikel > pembangunan bahagian belakang > Menggunakan errors.As() apabila melelaran struktur ujian, kembalikan argumen kedua kepada errors.As tidak sepatutnya *error
editor php Strawberry menemui ralat semasa mengulang struktur ujian. Apabila menggunakan ralat.As(), parameter kedua dikembalikan kepada ralat.As sepatutnya menjadi penunjuk kepada ralat, bukan ralat. Ralat ini boleh menyebabkan program berkelakuan tidak dijangka atau tidak betul. Oleh itu, apabila menggunakan ralat.As(), pastikan anda memberi perhatian kepada jenis parameter dan pastikan penunjuk kepada ralat dihantar untuk mengelakkan masalah. Masalah ini mungkin timbul apabila lelaran ke atas struktur ujian, jadi beri perhatian khusus apabila menggunakan ralat. As().
Saya sedang menulis beberapa ujian unit untuk pakej yang fungsi boleh mengembalikan berbilang jenis ralat. Saya mentakrifkan struktur sebagai:
tests := []struct { name string data string url string status int }
dan nak guna errors.as()
在我测试的错误中查找 test.err
. Contoh struktur yang saya gunakan dalam ujian saya adalah seperti berikut:
{ name: "url not available", err: &url.error{}, data: srvdata, url: "a", status: http.statusok, },
Saya ingin menambah errors.as
用于实现错误接口的不同结构类型。因此,正如您在结构中看到的那样,我将 err 定义为错误。可以看出,我使用 &url.error{}
, yang sepatutnya melaksanakan antara muka ralat.
t.run(test.name, func(t *testing.t) { data, err := i.getid(url) if err != nil { require.notnil(t, test.err) assert.true(t, errors.as(err, &test.err)) } else { // ... } })
Namun, menggunakan errors.as
seperti di atas mengembalikan
second argument to errors.As should not be *error
Sekarang dari apa yang saya faham, errors.as() menerima any
sebagai hujah kedua, jadi saya keliru mengapa *error tidak boleh digunakan.
Saya juga cuba menukar medan err
dalam struktur ujian kepada antara muka{} walau bagaimanapun, berbuat demikian menjadikan semua penegasan lulus tanpa mengira sama ada sasaran terdapat dalam ralat atau tidak.
Saya tidak dapat mencari cara menggunakan errors.as()
untuk melaksanakan jenis penyelesaian yang berbeza yang melaksanakan antara muka ralat dengan cara yang sama seperti di atas, jadi sekarang saya bergantung pada penggunaan contains ()
code> sebaliknya. Tertanya-tanya jika sesiapa boleh memberikan sedikit pandangan. errors.as()
来实现以与上面类似的方式实现错误接口的不同类型的解决方案,所以现在我依靠使用 contains()
来代替。想知道是否有人可以提供一些见解。
指向错误类型的指针不满足 error
接口,这就是为什么 as
的第二个参数的类型为 any
。为了将您想要的类型直接存储在 .err
字段中,该字段也必须是 any
ralat
, itulah sebabnya parameter kedua as
adalah jenis 🎜. Untuk menyimpan jenis yang anda mahu terus dalam medan .err
, medan tersebut juga mestilah jenis 🎜. 🎜
🎜Walau bagaimanapun, memandangkan anda telah membungkus nilai penunjuk ini dalam antara muka, anda perlu menggunakan penegasan jenis atau refleksi untuk mendapatkan nilai untuk pemeriksaan: 🎜
var testErr any = new(*url.Error) _, err := http.Get("http://error.error/") if errors.As(err, testErr) { fmt.Println(reflect.ValueOf(testErr).Elem()) }
Atas ialah kandungan terperinci Menggunakan errors.As() apabila melelaran struktur ujian, kembalikan argumen kedua kepada errors.As tidak sepatutnya *error. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!