Как правильно проверить тип ошибки, возвращаемой плагином. Открыть - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы знать, как я могу проверить тип ошибки, возвращаемой плагином. Откройте, например:

package main

import "plugin"

func main() {
  _, err := plugin.Open("./module.so")
  // here
}

Я хотел бы сделать что-то другое, если ошибка:

plugin.Open("./module.so"): realpath failed

Что в основном означает, что файл не существует.

Пример желаемого результата:

package main

import "plugin"

func main() {
  _, err := plugin.Open("./module.so")
  if err.Error() == "plugin.Open(\"./module.so\"): realpath failed" {
    // do something different here
  } else {
    log.Fatal(err)
  }
}

Строка, которую я передаю plugin.Open, может иметь другие значения, поэтомуэто должно быть что-то более умное, чем это.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 сентября 2018

Проверка кода для plugin.Open() показывает, что пакет вызывает некоторый код C, чтобы определить, существует ли путь.Если это не так, он возвращает простое значение ошибки.В частности, пакет не определяет какие-либо ошибки дозорного, с которыми вы можете сравнить, и не возвращает своего собственного конкретного разработчика интерфейса error, который переносит пользовательские метаданные.Вот код, который выдает эту ошибку:

return nil, errors.New(`plugin.Open("` + name + `"): realpath failed`)

errors.New - это базовая реализация интерфейса error, которая не позволяет передавать дополнительную информацию.В отличие от других расположений в стандартной библиотеке, которые возвращают ошибки (например, ошибки несуществующего пути из пакета os), вы не можете получить такие метаданные в этом случае.


Проверьте, является ли модульфайл существует первым

Я бы предпочел проверить, существует ли модуль перед тем, как попытается загрузить его, используя собственные возможности, предоставляемые пакетом os:

modulePath := "./module.so"
if _, err := os.Stat(modulePath); os.IsNotExist(err) {
    // Do whatever is required on module not existing
}

// Continue to load the module – can be another branch of the if block
// above if necessary, depending on your desired control flow.

Сравните подмножество значений ошибок

Вы также можете использовать strings.Contains для поиска значения realpath failed в возвращенном значении ошибки. Это не очень хорошая идея в случае, если строка изменится в будущем, поэтому, если вы примете этот шаблон, по крайней мере, вы должны убедиться, что у вас есть строгих тестов вокруг него (и дажетогда это еще не здорово).

_, err := plugin.Open("./module.so")
if err != nil {
    if strings.Contains(err.Error(), "realpath failed") {
        // Do your fallback behavior for module not existing
        log.Fatalf("module doesn't exist")
    } else {
        // Some other type of error
        log.Fatalf("%+v", err)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...