質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

3142閲覧

関数の戻り値によるエラーチェックについて

tuyudaku

総合スコア75

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2018/10/31 02:49

##関数の戻り値によるエラーチェックについて

関数の戻り値をチェックして、その動作が正しく行なわれたか確認するというのは大事だと思います。
特に、処理が正しく行なわれなかったらそこで処理を中断してシステムのエラーとして出力などをしたい場合、その都度チェックが必要かと思います。

しかし

C++

1int ret = 0; 2 3ret = system( ファイルの移動 ); 4 5ret = system( ファイルの移動 ); 6 7ret = system( 一箇所に集めたファイルを圧縮 );

と、このような場合
毎回のように、retをif文で確認していたらコードが多くなる上に
少し不恰好というか、見づらくなる気がします

C++

1int ret = 0; 2 3ret = system( ファイルの移動 ); 4if( ret != 0 ) 5{ 6 エラー 7 return; 8} 9 10ret = system( ファイルの移動 ); 11if( ret != 0 ) 12{ 13 エラー 14 return; 15} 16 17ret = system( 一箇所に集めたファイルを圧縮 ); 18if( ret != 0 ) 19{ 20 エラー 21 return; 22}

if文の中に直接System関数を入れればいくらかマシに見えますが
それでもif文が連続していることには変わりません

自分の考え方、作り方が悪い、知識が足りないせいで
このような作り方しか出来ていないのではと思いましたので
皆様ならどのように作るのかをお聞きしたいです。

以上、よろしくお願いします。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

時と場合によると思いますし、会社なり作成者の好みになりますが、私は質問者様のこの書き方は好きです。
どこでエラーとなったのか問い合わせなどのときにも後で追いかけやすいです。

不格好ではありますが、systemの返り値をそのまま判定に使う場合も多々。
(retをintで宣言しなくてもよくなるため)

// ファイルの移動処理1 if( system( FILE_MOVE ) != 0 ) { // ログ出力処理 // ファイルの移動1でエラー return; } // ファイルの移動処理2 if( system( FILE_MOVE ) != 0 ) { // ログ出力処理 // ファイルの移動2でエラー return; } // 一箇所に集めたファイルを圧縮 if( system( FILE_ARCHIVE ) != 0 ) { // ログ出力処理 // 一箇所に集めたファイルを圧縮でエラー return; }

投稿2018/10/31 03:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/10/31 03:49

>私は質問者様のこの書き方は好きです。 とても嬉しいお言葉ありがとうございますm(_ _)m 後々のことを考えると多少不恰好でも この形はベストなのでしょうかね 回答ありがとうございました。
guest

0

私は、エラー処理が、ログの出力程度の簡単で、共通化できる場合は以下のようなマクロを使ってます。

結構、ソースは見やすくなりますよ。

c++

1#define CHECK_ERROR(ret, msg) \ 2if (ret != 0) { \ 3 printf("%s(%d)" msg, __FILE__, __LINE__); \ 4 return; \ 5} 6 7ret = system( ファイルの移動 ); 8CHECK_ERROR(ret); 9 10ret = system( ファイルの移動 ); 11CHECK_ERROR(ret); 12

投稿2018/10/31 05:47

Harahira

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/10/31 08:40

>共通化できる場合は以下のようなマクロを使ってます なるほど、マクロの中で判定もさせてしまうのですね 式や定数ぐらいにしか使っていませんでした 回答ありがとうございました
guest

0

シンプルに書くなら、

C++

1int ret: 2 3ret = system( ファイルの移動 ) || 4 system( ファイルの移動 ) || 5 system( 一箇所に集めたファイルを圧縮 ); 6if(ret){ 7 fprintf(stderr,"どこかでエラー\n"); 8 return ret; 9}

どこでエラーだったのか、不明になりますが。

投稿2018/10/31 14:00

編集2018/11/01 02:29
otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/11/01 02:23

変数の代入の際の比較演算子はどのような解釈をすればいいのでしょうか? ret = 0 || 0 || 1; 1が代入されるのかな?とふんわりとイメージが出来るのですが ret = 4 || 2 || 9; とかだとどうなるのでしょうか?
otn

2018/11/01 02:43

どれかが非ゼロだと、1になるので、もとのリターンコードが何だったのかの情報が失われちゃいますね。そうか。
guest

0

正常が0の場合に限りますが、!= 0を省略可能です。

C++

1if( ret ) 2{ 3 //エラー処理 4 return; 5}

投稿2018/10/31 06:02

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/10/31 08:38

>正常が0の場合に限りますが、!= 0を省略可能です。 確かにそうですね! 回答ありがとうございました
guest

0

あまりキレイなものではありませんが論理演算の短絡評価を用いて

c++

1if( 2 system(移動) == 0 && 3 system(移動2) == 0 && 4 system(圧縮) == 0 5) { 6 // 成功時処理 7} else { 8 // 失敗時処理 9}

c++

1if( 2 system(移動) != 0 || 3 system(移動2) != 0 || 4 system(圧縮) != 0 5) { 6 // 失敗時処理 7}

という事も可能です。

ただし、どこで失敗したか分からないというのは不便なことも多いです。


ちなみに私はスコープは小さくしたいので

c++

1if(auto ret = system(移動)) { 2 // retが非0のとき変数retが使える状態で実行される 3} 4// 変数retが使えない 5 6// c++17以降はさらに 7if(auto ret = system(なにか); ret == -1) { 8 // retが-1の場合のみ実行される 9}

が便利かなと思います。

投稿2018/10/31 03:31

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/10/31 03:52

>論理演算の短絡評価を用いて なるほど、これは場合によっては使えそうですね >ちなみに私はスコープは小さくしたいので 色々なやり方がありますね... このやり方は是非まねしてみたいです! 回答ありがとうございました
guest

0

戻り値でエラーを検出するというのであればそうするしかないです。
もう一つのやり方として、エラーが起きたらその旨例外を生成させるという方法もあります

投稿2018/10/31 02:57

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2018/10/31 03:48

>エラーが起きたらその旨例外を生成させるという方法もあります 確かに、それが出来たらいいですね 多分私が現在携わっているシステムはそうしたほうがいい気がします... ただ、これをやると大きな変更になるので出来ないでしょう... まったく、思う通りに行きませんねw 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問