2019年6月27日木曜日

Golangのtry-catch的なやり方

以下のphpのtry-catchの書き方、ウェブエンジニアなら、恐らく何度でも目にしたことがあると思います。
<?php
function hoge() {
    try {
        throw new Exception("throw error\n");
    }catch(Exception $e) {
        echo $e->getMessage();
        echo "will do something to rollback";
    }
}
hoge();
?>
Golangなら、相等な書き方はないでしょうか?
答えは、あります。サンプルは下記の通りです。
package main
import (
    "fmt"
)
func hoge() {
    defer func() {
            if err := recover(); err != nil {
                    fmt.Println("catch the error.", err)
                    fmt.Println("will do something to rollback")
            }
        }()
        panic("throw exception")   
}
func main() {
    hoge()
}
簡単に説明します。
異常が発生しそうなソースコードの前に、「recover」を使って、異常を捕捉(catch)することができます。
特にDBの何かエラーが発生しそうで、rollbackをしないといけないときに、とておも役に立つと思います。
使い方は以下のように↓
func 関数名() {
    defer func() {
        if err := recover(); err != nil {
            // rollbackはここに書く
        }
    }
    // db実行などエラーが発生しそうなコードはここに書く
}

2019年6月19日水曜日

sedコマンドで、「sed: 1: "app.conf": command a expects \ followed by text」のエラーが発生しました

以下のコマンドで、ファイルの中の文字「password = xxxx」を「password = test」に置換しようとしたら、エラーが発生しました。

sed -i 's/password = xxxx/password = test/g' app.conf
sed: 1: "app.conf"command a expects \ followed by text
調べたところ、Macのsedの場合は、-iオプションの後に、必ずバックアップ用の拡張子をつける必要があります。
そして、拡張子をつけたところで、再度実行してみました。今回うまくいきました。
sed -i .bak 's/password = xxxx/password = test/g' app.conf
ls -ls でみると、
app.conf.bak というファイルも同時に作られたことを確認でしました。それは変更前のファイルとなっています。不要なら消して問題ないです。