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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

1893閲覧

関数の処理が正常に終了したときとエラーのときで返り値を使い分ける方法について

ibuki

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/03/22 04:20

編集2022/01/12 10:55

C#にて、データを取得する処理を行う自作のDLLライブラリA,Bを用意し、
ユーザーがAかBを選んで選択された方に必要な引数を渡し、データを取得させます。
しかし、A,Bの処理でエラーが出た場合、取得するデータではなくエラーコードを返すには、どうしたら良いでしょうか。

調べたところ、返り値をObject型とするか、ref/outを渡すか、例外を取得するのが良いとありました。
しかし、Object型は汎用性が高すぎて対応する型で返る保証がないので良くなく、
try-catchで例外を取って対処するのは、
A,Bがデータを返すまでの処理の仕方は不明で、どういうエラーが来るか分からないため、
一括でint型のエラーコードを取って、それに対応するメッセージをユーザーに返し、
それ以外は不明なエラーとしたいです。
また、A,BがC#なのかC++なのか他の何かなのかも不明なため、ref/outもできるだけ使いたくないです。

そのため、現在は取得したデータを返すクラスにエラーコード用の枠を用意して、0なら成功してデータ取得、それ以外ならエラーとしています。
しかし、取得するデータが単純なクラスやリストならともかく、どうしても対応しきれない場合もありそうで気持ち悪いので、
他に適切な方法はないでしょうか

追記
申し訳ありません。await/asyncでデータ取得処理を行うという条件も追加させてください

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

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

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

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

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

guest

回答3

0

例外をだすというのが筋ではあるのですが、別解。

C#7.0から関数の返り値にタプルが使えるようになりました。http://ufcpp.net/study/csharp/datatype/tuples/
これを使って、複数の値を返り値にすれば、問題解決だと思います。
一つの返り値では、解決できません。

昔だったら、classを作って・・とか必要だったのですが、タプル構文を使うと、
このレベルでは必要とならなくなりました。
まぁ、classを作るといっても、

class Response<T> { public int Code{ get;set;} public T Result{ get;set;} }

ぐらいのものを作るだけなんですけど。

通信周りだと、よくつかうテクニックですね。
HttpClientの返り値を参考にするといいと思います。
await/asyncでも問題なく使えると思います。

なお、C++とかのDllをつかうことを全く考えていません。(トラブルだらけなのでやりたくない)

投稿2018/03/22 16:24

編集2018/03/22 17:08
kiichi54321

総合スコア1984

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

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

0

普通例外です。
Exception を継承したクラスを作ってそれを発生させればどんな例外が発生したかわかりますし追加情報も付与できます。

ついでに言えば自作の DLL の言語がわからないというのも状況がわかりませんがどちらにしても ref/out は使えます。DllImport とマーシャリングを調べてみてください。

投稿2018/03/22 04:31

Zuishin

総合スコア28656

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

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

0

ふつう、そういう場合には例外を発動させます。Exception と言うやつですね。
まずはこのキーワードでぐぐって一通り読んでおいてください


DLLでExceptionを使用したくない、使用しない、という場合は、戻り値に正常なら0、異常なら0以外を返す、とか、正常ならtrue、異常ならfalseを返す、とかいろいろありますね
戻り値にオブジェクトを返す関数の場合は、異常の場合は nil をかえすってのもアリです

投稿2018/03/22 04:26

編集2018/03/22 04:31
y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問