1. 程式人生 > >如何在指令碼設定set -e之後捕獲異常並完成相關操作執行

如何在指令碼設定set -e之後捕獲異常並完成相關操作執行

背景:指令碼中設定set -e 遇到報錯即停止指令碼執行 ,取消set -e有可能會造成更大的錯誤,因此為了處理某個異常之後能夠繼續執行,給出以下解決辦法。

說明set -o xtrace 列印指令碼執行日誌。

以一個例子來說明:刪除目錄下的某一個不存在的檔案然後再次檢視該檔案會報錯!

報錯的指令碼

截圖中標記的地方會丟擲一個異常,因為test.txt是不存在的,如下圖指令碼執行日誌:

原因分析:因為cat /home/test.txt檢視一個不存在的檔案,這條命令返回非0!
如截圖,如果命令正常執行,執行echo $?會返回0,如果執行異常則返回非0!

解決辦法:使用"||",在當前命令執行失敗之後,會執行||後面的內容,如下:

方案1:修改之後的指令碼,此時會執行到此處列印do next step!,然後退出

修改之後指令碼執行日誌

方案2:捕獲異常後執行相關函式解決該異常,簡單示例如下:
指令碼

指令碼執行日誌

以上是寫指令碼時總結出來的經驗,如有雷同純屬巧合,歡迎留言.... :)

相關推薦

如何在指令碼設定set -e之後捕獲異常完成相關操作執行

背景:指令碼中設定set -e 遇到報錯即停止指令碼執行 ,取消set -e有可能會造成更大的錯誤,因此為了處理某個異常之後能夠繼續執行,給出以下解決辦法。 說明:set -o xtrace 列印指令碼執行日誌。 以一個例子來說明:刪除目錄下的某一個不存在的檔案然後再次檢

shell 指令碼set -e選項作用範圍

        編寫shell指令碼沒多久,對於其許多命令的具體用法還不太熟悉。最近剛好有需求,就嘗試用指令碼去實現。其中就有用到set -e選項。         在用這個命令之前,也查過其功能,描述比較簡單:就是當命令以非零狀態退出時,則退出shell。主要作用是,當指令

@Transactional使用try->catch捕獲異常回滾方法

業務需求:需要捕獲到@Transactional中的異常,並不影響事物回滾 @Transactional(rollbackFor = Exception.class) public void test() { try { updata();

Unix/Linux指令碼中"set -e"的作用

有些指令碼中會看到這樣的語句:#!/bin/bash set -e command 1 command 2 ... exit 0“set -e” 這句語句告訴bash如果任何語句的執行結果不是true則應該退出。這樣的好處是防止錯誤像滾雪球般變大導致一個致命的錯誤,而這些錯

Android自定義全域性捕獲異常上傳,實現實時收集APP崩潰crash資訊

一、異常收集 目的:在APP上線後,可能會出現一些BUG導致了APP的閃退,使用者體驗就非常致命,我們一定要第一時間找到問題的所在,去處理掉問題,處理有方法有兩種,一是發一個修改後的新版本,另一個是用熱修復釋出一個更新補丁,具體選擇哪一種符合自己需求就行。 我們主要說的異常

解釋bash指令碼set -eset -o pipefail的作用

man set中的解釋:       set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...]       set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]... ...        

SpringBoot @Transactional 中捕獲異常回滾解決方法

業務需求:需要捕獲到@Transactional中的異常,並不影響事物回滾@Transactional(rollbackFor = Exception.class) public void test() { try { updata();

JAVA學習之類與物件例題分享(兩點確定直線進行相關操作

最近在自學JAVA,學到類與物件章節,分享一個自我感覺還可以的例題答案,自己編寫的,發出來希望大神們知道一二。 源程式如下: package Line_Test; public class Line_Test { public static void main(String[] a

Spring Boot整合Mybatis完成CRUD操作

MyBatis 是一款優秀的持久層框架,被各大網際網路公司使用,本文使用Spring Boot整合Mybatis,並完成CRUD操作。 為什麼要使用Mybatis?我們需要掌握Mybatis嗎? 說的官方一點: MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBa

業務層刻意拋出異常,全局異常捕獲按格式返回

ges pub .cn public oba src lob system server 對於業務層的程序的致命錯誤,我們一直的做法就是直接拋出指定的異常,讓程序去終斷,這種做法是對的,因為如果一個業務出現了致命的阻塞的問題,就沒有必要再向上一層一層的返回了,但這時有個問題

為Android程式設定全域性的捕獲異常,提升使用者體驗(UncaughtExceptionHandler捕獲全域性異常

主要方法:通過Thread.setDefaultUncaughtExceptionHandler()方法將異常處理類設定到執行緒上即可。 實現類 public class CrashHandler implements UncaughtExceptionHandler {

jquery 設定style:display、$.post請求捕獲異常

style.display (“#id”).css(‘display’,’none’); $(“#id”).css(‘display’,’block’); 或: $(“#id”)[0].style.display = ‘none’;

Python logging模組 捕獲異常儲存為 logging 檔案

____tz_zs logging模組簡單使用 basicConfig . #!/usr/bin/python2.7 # -*- coding:utf-8 -*- """ @author: tz_zs """ import logging import ti

WPF異常捕獲使程式不崩潰!

在.NET中,我們使用try-catch-finally來處理異常。但,當一個Exception丟擲,丟擲Exception的程式碼又沒有被try包圍時,程式就崩潰了。 這些異常往往是你沒有注意到的。在WPF中,提供了一種處理這些個異常的方式。 舉例來說明。 1.先

js下載檔案,捕獲異常的記錄

在伺服器返回ResponseEntity<byte[]>這種二進位制流的情況下,對於異常的捕獲封裝返回的卻仍然是json,今天折騰了很久 總結如下: 該介面返回值為ResponseEntity<byte[]>,有異常攔截@[email p

jenkins,Tomcat重啟指令碼設定jvm引數之後遇到了一個坑。

如下是我的重啟指令碼 #/bin/sh source /etc/profile sh /opt/kms_jsoncach.sh pid=`ps -ef | grep "APPmanager" | grep -v 'grep\|tail\|more\|le

go語言捕獲panic異常轉化為error

package main import ( "fmt" "errors" ) func testPanic2Error() (err error) { //捕獲 and 恢復 panic. /*注意defer延

Android項目引入actionbarsherlock作為library後混淆之後異常

菜單 解決 div 破壞 att pla track library and 現象: Android APP中,引入actionbarsherlock 開源庫作為滑動菜單,調試執行沒有問題,項目混淆打包後,程序執行異常退出,截獲異常log為: <spa

C#高級編程八十一天----捕獲異常

意思 esp rgs track com nbsp 原因 修飾 tracking 捕獲異常 前面主要說了關於異常的一些基礎和理論知識,沒有進入到正真的異常案例,這一講通過幾個案例來描寫敘述一下異常的捕獲和處理. 案例代碼: using System; usi