Проверка кода для 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)
}
}