69434


Qt(C++)でファイル出力するときに、エラー出力はどうすればいいのでしょうか  
オープン失敗時は良いのですが出力時はどのように検知したら良いでしょう

[code]

        QFile file(FullPath);
        if(!file.open(QIODevice::Append)){          //ファイルオープン
            //ファイルオープン失敗
            //エラー処理色々
            return;
        }
    
        QTextStream out(&file);
        QTextCodec* codec = QTextCodec::codecForName("Shift_JIS");
        out.setCodec(codec);
    
        out << "テキスト色々\r\n";               //キューから取り出した文字列をそのままテキストストリームに出力する
        //エラーの検知どうするか?
        file.close();
    
[/code]


CC BY-SA 4.0
2020-08-06T02:43:56.340
69292
2020-08-10T20:35:38.363
2020-08-06T08:27:34.443
3060
10098
question
c++ qt qt-creator
Qtでテキストファイル出力時のエラー検知


質問するときは環境に関する情報を詳しく記述しましょう。

  * [技術系メーリングリストで質問するときのパターン・ランゲージ](https://www.hyuki.com/writing/techask.html)

厳密にチェックするのであれば、おそらく操作のたびに都度[`QTextStream::status()`](https://doc.qt.io/qt-5/qtextstream.html#status)を呼び出す必要があるんじゃないでしょうか。  
書き込みエラーが発生した場合は[`QTextStream::WriteFailed`](https://doc.qt.io/qt-5/qtextstream.html#Status-
enum)が返ってくるのだと思われます。

QtのAPI設計がどうなっているのか詳しくは知りませんが、少なくともリファレンスには、`QTextStream::operator<<()`は異常系において例外をスローするとは書かれていないようです。

もともとQtは例外ではなくエラーコードを使用する設計になっていて、例外クラス[`QException`](https://doc.qt.io/qt-5/qexception.html)はQt
5.0で追加されたものだそうです。

  * [Exception Safety | Qt 5.15](https://doc.qt.io/qt-5/exceptionsafety.html)


CC BY-SA 4.0
2020-08-06T19:27:10.677
69312
2020-08-06T19:27:10.677
15413
69292
answer


質問の意図が、「どれくらい注意深くエラーチェックをしたものでしょうか」だと仮定します。

ファイルの終わりにいたるまでエラーが一度もおこらなければOK、一度でも起きたらNG、  
という典型的と思われる要件を満たすのであれば、closeの手前でstatus  
チェックをすれば、最低限のチェックができると思います。statusが一旦WriteFailedに  
なったら、自動的にOKに戻ってしまわない、という前提ですが（ご自身で調べてください）

ファイルの書き込み処理がループ構造をしているのであれば、ループの各回の末尾で  
チェックするようにすれば、エラーが起きてから早めに処理を止めることができると思います。

要件が変われば、必要なエラーチェックの頻度も変わると思います。  
たとえば名簿データを書き込もうとしていて、名前の書き込みの際に走る文字コード変換で  
エラーが特定の人で出るようなときに、どのエントリーでエラーが起きるのかをユーザに示したい、  
というような場合であれば、エラーのリスクのある項目を１つ書き込む度にチェックして、  
そのつどエラー処理を書く必要があるでしょう。


CC BY-SA 4.0
2020-08-07T01:41:36.313
69318
2020-08-07T01:41:36.313
40200
69292
answer


[QTextStream
のコード](https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/serialization/qtextstream.cpp?h=dev)
を見ると、 データを読み込む際には内部で setStatus() をして status()
を更新していますが、書き込み時にはステータスのチェックはしていないようです。

ということで、QFile (の基底クラスの QFileDevice)の
[error()](https://doc.qt.io/qt-5/qfiledevice.html#error) を確認する方が確実だと思います。


CC BY-SA 4.0
2020-08-10T20:35:38.363
69434
2020-08-10T20:35:38.363
10245
69292
answer