Как отладить & ldquo; выйти из состояния 1 & rdquo; ошибка при запуске exec.Command в Golang

Я столкнулся с этой проблемой в некоторых проектах с Xcode 9.3.1, и в моем случае проблема связана с некоторым быстрым кодом, который по какой-то причине Xcode не нравится. Эта проблема трудно решить, потому что трудно найти, какой файл вызывает проблему.

Когда у меня возникает эта проблема, я удаляю некоторые файлы из проекта Xcode (удаление ссылок), и я пытаюсь проверить, работает. Мой процесс для этого

  1. Удалить некоторые файлы
  2. Закрыть Xcode
  3. Открыть Xcode
  4. Если индексирование завершено, попробуйте переименовать некоторые метод, если работает, вероятно, файлы, которые вы удалили, у них есть что-то странное для Xcode.

В моем случае у меня было определение класса с реактивным расширением в том же файле, и по какой-то причине Xcode ему не нравится, я переместил реактивное расширение в другой файл и теперь индексирование отлично работает.

29
задан laurent 3 October 2016 в 21:45
поделиться

2 ответа

Решением является использование свойства Stderr объекта Command. Это можно сделать следующим образом:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
    return
}
fmt.Println("Result: " + out.String())

Выполнение приведенного выше кода позволит понять, в чем заключается проблема:

состояние выхода 1: найти: -exec: нет завершения ";" или "+"

Редактировать:

В приведенном выше коде мы ожидаем, что в случае ошибки сообщения будут напечатаны в stderr и команду вернет ненулевой код ошибки. Это более или менее стандартно.

Однако, как упомянуто ниже @snorberhuis, некоторые команды выводят ошибки на стандартный вывод. Другие команды могут печатать в stderr, но возвращать код ошибки 0 (в этом случае err будет nil). И наличие сообщений в stderr не обязательно означает, что есть ошибка (инструменты ffmpeg делают это много).

Таким образом, в основном вам может понадобиться настроить приведенный выше код для соответствия ожидаемым командам.

71
ответ дан laurent 3 October 2016 в 21:45
поделиться

Как упоминал Лоран, вы можете переопределить файловый дескриптор Stderr, чтобы захватить вывод stderr для лучшего сообщения об ошибке. Лично я предпочитаю использовать метод CombinedOutput для команды, если выполняешь что-то относительно простое:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
output, err := cmd.CombinedOutput()
if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + string(output))
    return
}
fmt.Println(string(output))

Вот ссылка play.golang.org для приведенного выше примера: http: // play. golang.org/p/z8k9zO755P

25
ответ дан Yves Junqueira 3 October 2016 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: