Обнаружение конкретной ошибки по типу с несколькими ошибками - PullRequest
2 голосов
/ 06 марта 2019

Попытка отличить плохую ошибку в пользовательском cookie от внутренней ошибки, используя gorilla/sessions например,

import "github.com/gorilla/sessions"

sess, err := store.Get(r, sessName)
if err != nil {
    // either user error (bad-cookie i.e. invalid HMAC)
    //      http.Error(w, "not authenticated", http.StatusUnauthorized)

    // or server error (FileSystemStore i/o)
    //      http.Error(w, "internal error", http.StatusInternalServerError)
    return
}

В базовом пакете securecookie есть экспортированная ошибка ErrMacInvalid для плохих пользовательских файлов cookie.Поэтому обычно нужно просто проверить эту конкретную ошибку, но это не работает:

import "github.com/gorilla/securecookie"

if err == securecookie.ErrMacInvalid {
    // bad user-cookie
} else if err != nil {
    // otherwise internal error
}

Причина, по которой он не работает - используя скажем securecookie.NewCookieStore() в качестве хранилища сеансов -он вернет ошибку типа securecookie.MultiError (тип []error) со значением securecookie.ErrMacInvalid, указанным в срезе ошибки.

Попытка чего-то подобного выглядит очень запутанной:

if e2, ok := err.(securecookie.MultiError); ok && len(e2) > 0 && e2[0] == securecookie.ErrMacInvalid { {
    // bad user-cookie
} else if err != nil {
    // otherwise internal error
}

Есть ли более простой способ?

1 Ответ

3 голосов
/ 06 марта 2019

Есть ли более простой способ?

Нет.К сожалению.

...