2015-12-04 3 views
2

Как бросить ошибку в Баш, чтобы получить в моем поймать пункта (я не уверен, что это выражение на самом деле называется)Как выбросить ошибку в Bash?

{ 
    # ... 
    if [ "$status" -ne "200" ] 
    # throw error 
    fi 
} || { 
    # on error/where I want to get if status != 200 
} 

Я знаю, что я просто не мог использовать функцию, но этот случай сделал мне любопытно, можно ли это сделать

+1

'||' d блок будет работать, просто добавьте 'echo" err msg "; exit 1; '? ИЛИ использовать более традиционные 'if cond; затем echo OK; else echo ERR; fi'? ИЛИ вам нужно предоставить более подробный (но небольшой) вариант использования. Удачи. – shellter

+0

@shellter почему в качестве комментария? exit не заканчивается в условии * catch * tho, я уже пробовал это – Brettetete

+0

Да, почему бы просто не использовать 'if' и' else'? Это странный синтаксис. – miken32

ответ

2

Есть несколько способов, чтобы сделать что-то подобное:

использование Подоболочкой (не может быть лучшим решением, если вы хотите установить параметры и т.д. ...)

(
if [[ "$status" -ne "200" ]] 
then 
    exit 1 
fi 
) || (
    # on error/where I want to get if status != 200 
    echo "error thrown" 
) 

используют промежуточную ошибку переменная (вы можете поймать мул несколько ошибок, установив разные числа. Кроме того: меньше глубина вдавливания)

if [[ "$status" -ne "200" ]] 
then 
    error=1 
fi 

if [ $error != 0 ] 
then 
    echo "error $error thrown" 
fi 

использовать сразу значение выхода из теста (обратите внимание, что я изменил -ne к -eq)

[[ "$status" -eq "200" ]] || echo "error thrown" 
+0

Я лично предпочитаю что-то вроде вашей '$ error'. Даунсайд - у вас может быть куча вещей между вашей неудачей и вашей окончательной проверкой кода ошибки, которую вы хотели бы пропустить при ошибке. Теперь они должны иметь один дополнительный уровень отступов, когда логически они, вероятно, должны быть верхнего уровня. – 4ae1e1

+0

Я знаю, но у меня такое впечатление, что он хочет делать другие вещи, прежде чем проверять, была ли ошибка выбрана ... –

3

Один из способов сделать это - только с выходом, как упоминает обстрел, но вы должны создать подоболочку для этой работы (которая существует на выходе). Для этого замените фигурные скобки круглыми скобками.

Код будет

(
# ... 
if [ "$status" -ne "200" ] 
    exit 1 
fi 
) || { 
    # on error/where I want to get if status != 200 
} 
+0

Создание подоболочки во многих случаях нецелесообразно (например, вы не можете установить какой-либо параметр), поэтому определенно не рекомендуется. – 4ae1e1

+0

@ 4ae1e1, самая близкая вещь в bash, чтобы сделать это, чтобы сделать именно это. Вы можете использовать разные коды выхода, если хотите различать разные «исключения» – toth

+1

Нет, это явно не «самая близкая вещь в bash». Там встроена «ловушка». – 4ae1e1

1

Код возврата для фигурных скобках код возврата последнего выполненного оператора в фигурных скобках. Итак, вот один метод, который использует оболочку встроенная_команда_оболочки false:

{ 
    # ... 
    if [ "$status" -ne "200" ]; then 
    false # throws "error" (return code=1) 
    fi 
} || { 
    echo "Caught error" # on error/where I want to get if status != 200 
} 

В данном конкретном случае, if заявление является излишним. Тест заявление, [ "$status" -ne "200" ], бросает код выхода, что вам нужно:

{ 
    # ... 
    ! [ "$status" -ne "200" ] 
} || { 
    echo "Caught error" # on error/where I want to get if status != 200 
} 
+1

Это не будет работать, если после оператора if будет указан код, статус возврата будет возвратом статуса последней команды. Лучше всего использовать подоболочку. – toth

+0

@toth Пожалуйста, перечитайте первое предложение в моем ответе. – John1024

+0

@toth Это своего рода лучший способ, пока вам не нужно установить параметр. Не используйте подоболочку, пока это не будет необходимо. Как я сказал выше, используйте 'trap', если вам действительно нужно эмулировать пару throw/catch (недостатком является то, что вам нужно обернуть свой материал в функцию). – 4ae1e1

Смежные вопросы