2016-03-18 20 views
2

Benim sınama dosyasında, beklenen hata ile algılanan gerçek bir hata karşılaştırmak çalışıyorum. Ancak, bu karşılaştırma yanlış olarak değerlendirir ve neden emin değilim. Bu, iki aynı hata oluşturduğunda ve bunları karşılaştırabildiğimde bile olur.Hataların karşılaştırılması <a1> Hata</ ​​a1>

Kod pasajı:

func TestCompareErrors(t *testing.T) { 
    if fmt.Errorf("Test Error") != fmt.Errorf("Test Error") { 
     t.Errorf("Test failed") 
    } 
} 

Bu aynı hata mesajı var ne iki farklı değerler karşılaştırdığınız

cevap

3

"Test başarısız oldu" ile sonuçlanır. io.EOF gibi ortak değerlerle yaptığınız gibi, önceden tanımlanmış hata değerlerini karşılaştırmak istersiniz.

http://play.golang.org/p/II8ZeASwir

var errTest = fmt.Errorf("test error") 

func do() error { 
    return errTest 
} 

func main() { 
    err := do() 
    if err == errTest { 
     log.Fatal("received error: ", err) 
    } 

} 

Bir daha derinlemesine açıklama için "Errors are Values" okuyabilir.

Hata ile ilgili daha fazla bilgi vermeniz gerekirse, kendi hata türünüzü oluşturabilirsiniz. Ardından, istediğiniz herhangi bir bilgiyi hataya ekleyebilir ve bu tür bir hatayı, bir tür onaylama yoluyla kontrol edebilirsiniz.

type myError string 

func (e myError) Error() string { 
    return string(e) 
} 

func do() error { 
    return myError("oops") 
} 

func main() { 
    err := do() 
    if err, ok := err.(myError); ok { 
     log.Fatal("received myError: ", err) 
    } 
} 
+2

Tamam, ama ne hata mesajı dinamik içeriği (örneğin sahipse "beklenmeyen girdi: [şey]" ya da olduğu bu durumda kötü bir uygulama – edwardmp

+1

@edwardmp?: evet, hataya dinamik bir mesaj vermek genellikle kötü bir uygulamadır, değerleri karşılaştırmak için yeteneği kaybedersiniz. ['net.OptError'] gibi teknikleri kullanabilirsiniz (https://golang.org/pkg/net/#OpError) (hataya fazladan bilgi eklediğiniz ['net.Error'] (https://golang.org/pkg/net/#Error) ve' error'() hatalarını karşılar ve hata türünü bir tip iddiası ve yöntemleri – JimB

+0

Doğru, bu iyi bir çözümdür. – edwardmp

3

Değerleri karşılaştırmak için reflect.DeepEqual kullanın.

if reflect.DeepEqual(fmt.Errorf("Test Error"), fmt.Errorf("Test Error")) { 
    // the error values are same. 
} 

Örnek içinde playground

İlgili konular