(Delphi) 例外の再生成について

このQ&Aのポイント
  • Delphi の Ini ファイルを操作するクラス TCustomIniFile の ReadFloat メソッドについて、例外の再生成について疑問があります。
  • ReadFloat メソッドのソースコードを見ると、EConvertError 例外以外の場合には、なぜわざわざ else 節で同じ例外を再生成しているのかわかりません。
  • 1 と 2 の部分がなくても結果は同じではないかと思いますが、何か意図があるのでしょうか?
回答を見る
  • ベストアンサー

(Delphi) 例外の再生成について

例外の再生成のことで質問があります。 Delphi の Ini ファイルを操作するクラス TCustomIniFile には、 ReadDate や ReadFloat といったメソッドがありますが、 このメソッドのソースコードを拝見すると、例外処理を行っている部分で EConvertError 例外以外の時は else 節の raise で同じ例外を再生成しているのですが、 この else 節は無くても同じ気がするのですが、どうしてわざわざ else 節で キャッチした例外を再生成しているのでしょうか? EConvertError 例外以外は例外処理しなければそのままメソッド呼び出し元に伝わりますが、 あえて raise で再生成していることに何か意図はあるのでしょうか? 以下は ReadFloat メソッドのソースコードです。 1 と 2 の部分がなくても結果は同じではないのでしょうか? function TCustomIniFile.ReadFloat(const Section, Name: string; Default: Double): Double; var  FloatStr: string; begin  FloatStr := ReadString(Section, Name, '');  Result := Default;  if FloatStr <> '' then  try   Result := StrToFloat(FloatStr);  except   on EConvertError do    // Ignore EConvertError exceptions   else ←―――――――――――――― 1    raise; ←―――――――――――――― 2  end; end;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

あまりお勧めできないコーディングスタイルだけど (elseは処理する必要が無い例外までトラップしちゃうから、 不用意に握りつぶしちゃう危険性がある) デバッグ時に、ステップ実行する際、トラップしていない例外が発生しても、 プロシージャの外に出ないで2のとこで止まるって利点があります。 しかし、前述したように、おすすめしません。 あぁ、Delphi懐かしいなぁ。

matsu79
質問者

お礼

回答どうもありがとうございます。 特別な理由がない限りelseは書かないほうがいいみたいですね。 処理する必要のない例外は何もしないようにすることにします。

関連するQ&A

  • 例外処理についてお願いします!!

    下のプログラミングについていくつか質問があります。 (1) プログラムの冒頭に来るpublic static void main(String[] args)を今まで気にしていなかったのですが これはどういうことですか?これもメソッドのひとつなんですか?このプログラムではpublic static void main(String[] args)でメソッドを定義してそれをetest( )メソッドで開いているという感じでしょうか? それとetstってどこから来たのかわかります?作者が勝手につけた名前だそうですが。 (2)FileReader fr = new FileReader("xfile.txt"); のところがわかりません。これはどういう意味ですか? public static void main(String[] args) { public static void etst( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } } よろしくお願いします!!

    • ベストアンサー
    • Java
  • mainメソッドのthrows節で設定した例外はどこでcatchされる

    mainメソッドのthrows節で設定した例外はどこでcatchされる? java初心者です。 例えば、mainメソッドの中でAというメソッドが呼ばれるとします。 そのAについての宣言文(定義文)にthrows節が書かれているような場合、 mainメソッド内で、Aを呼び出す際、Aの実行の中で、もし例外が発生した場合には、 mainでその例外をキャッチして処理するよう、mainの記述を行う必要があるかと思います。 では、mainメソッド自体に設定したthrows節(つまり、 public static void main(String[] args) throws TestException{ ~略~ } という宣言) については、 その例外(ここでは、TestException)は、どこでcatchすることになるのでしょうか? もしや、「投げっぱなし」ということなのでしょうか? mainメソッド自体は、基本的に他のメソッドから呼ばれるものではないかと思うので、 mainメソッドでスローした例外の受け取り場所がわからなくて質問させていただきました。 色々調べたつもりなのですが、よくわからなくて困ってしまいました。 あまりに初歩すぎて、どこにも書かれていないのかなんなのか、 その説明が見当たらないこと自体にも、疑問を感じている次第です。苦笑 以上、どなたか、宜しくお願い致します。

    • ベストアンサー
    • Java
  • intra-martの自動生成DAO

    intra-martを勉強中です。 eBuilder7.2を使用してDAOを自動性すると下記の問題が発生します。 回避方法をご存知でしたらご教示ください。 1)取得レコードが1件のSELECTメソッドを作成した場合  生成ソースのresultSet取得部分が数字の指定になる。  これをカラム名指定にしたい。  result.setEmpCd(resultSet.getString(1));  ->  result.setEmpCd(resultSet.getString("EMP_ID")); 2)取得レコードが複数件(配列)のSELECTメソッドを作成した場合  生成ソースのresultSet取得部分が  ダブルクォーテーション囲みの数字の指定になる。  当然"1"というカラムはないためException発生。  これをカラム名指定にしたい。  result.setEmpCd(resultSet.getString("1"));  ->  result.setEmpCd(resultSet.getString("EMP_ID"));

    • ベストアンサー
    • Java
  • 例外処理をするソースコードについて

    例外処理するソースコードについて質問があります。 まず例外処理される前のファイルのソースコードを見てください。 public class JTest13 { public static void main(String[] args) { System.out.println("実行開始"); long lngTmp; //以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされる lngTmp = Long.parseLong(args[0]); //割り算を実行する(小数点以下の数値を管理する必要がある)ため、double型に変換します System.out.println(Double.parseDouble(args[0]) / 2); System.out.println("tryブロック終了"); System.out.println("実行終了"); } } ここでアルファベットを入力すると、 実行開始 Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at JTest13.main(JTest13.java:20) これで例外処理クラスがNumberFormatExceptionだと分かるんですが、 こういう結果がでなければいけません。 実行開始 例外:java.lang.NumberFormatException For input stirng:"a" 引数を整数で入力して下さい。 実行終了 これで問題なのがmainメソッドで例外処理するのではなく、整数チェック用のメソッド内でエラー処理するプログラムを作らなければならない事です。 変数がargs[0]なのでどうやってメソッドを作っていいのか分かりません。 ヒントだけでいいので、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java
  • ParseとTryParseを実装するなら

     こんにちは。c#初心者です。  c++にも、c#にもintにParseメソッドと、TryParseメソッドがあると思いますが、intのように比較的簡単に解析できるもの(比較的簡単なメソッド)ならParseメソッドをコピペして、例外の部分を「return false;」に変えるだけで十分だと思うのですが、問題は、Color構造体のような(やや)複雑なものです。  R, G, Bに加え、α値があり、また、名前で色を表す可能性もあります。考えただけで(intと比べると)かなり面倒なメソッドになることが分かると思うのですが、とりあえずParseメソッドを実装したとしましょう。  次にどうせならTryParseメソッドも実装したいところなのですが、初心者が考えた方法は3つあります。 1、Parseメソッドをコピペして(FormatExceptionなどの)例外部分を「return false;」に変える。 2、Parseメソッドをtryブロックに入れて、catchブロックで「return false;」とする。 3、privateなtryParseメソッドを用意し、それをベースにする。戻り値はException型で、Parseメソッドではnullで無ければスロー、TryParseメソッドでは「return exception == null;」とする。 (ソースコードは一番下)  1は保守性上、少々問題ありかと。2は利用側がちょっと楽になることには変わりないが、パフォーマンス重視には向かない(というかテキストを解析している時点でパフォーマンス低いかな?)、3は1、2の問題を克服しているもののこのような設計でよいのか自信なし。  という訳で悩んでいます。どれが一番良いでしょうか? もっと良い案があればそれでも良いです。どなたかわかる方がいらしゃいましたら教えてください。 ----------- 簡易ソースコード -------------- c#で書いています。また読みやすく(なっているかどうかは分かりませんが)するため、1行で書けるところも2行以上で書いている部分もあります。 案1 public static Color Parse(string text) {   ……   if ( invalid ) throw new FormatException();   …… } public static bool TryParse(string text, out Color result) {   ……   if ( invalid ) {     result = Color.Empty;     return false;   }   …… } ------------------------------------------------ 案2 public static Color Parse(string text); // 略 public static bool TryParse(string text, out Color result) {   try {     result = Parse(text);     return true;   }   catch ( FormatException ) {     result = Color.Empty;     return false;   } } --------------------------------------------------- 案3 private static Exception tryParse(string text, out Color result) {   ……   if ( invalid ) {     result = Color.Empty;     return new FormatException(); // スローせずに返す   }   …… } public static Color Parse(string text) {   Color result;   Exception exception = tryParse(text, out result);   if ( exception != null ) throw exception;   else return result; } public static Color TryParse(string text, out Color result) {   Exception exception = tryParse(text, out result);   if ( exception == null ) return true; // 例外が無ければ成功   else return false; }

  • パネル生成メソッドの作り方

    作成するパネルの数とを引数に与えると、そのパネルを作成して表示するメソッドを作りたいのです。 下記のようにすると "variable name method createPanelの宣言が重複しています"とエラーになってしまいます。 引数でもらってきた文字列を生成するパネルの名前にしたいのですが、なぜこれではいけないのですか? どうしたらよいのですか? 例) public void createPanel(String name) {  Panel name = new Panel(); }

    • ベストアンサー
    • Java
  • 例外処理に関して

    質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が2回キャッチされているようで、2回目にファイル(ログファイル)は既に開かれています。というエラーが出ますが、以下のソースでは、呼出元と呼び出されたメソッドともに例外を処理してしまうのでしょうか? また、どう改善したらいいでしょうか? ご教授よろしくお願い致します。 呼出元 public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try    Dim cls As New testClass cls.timer1() Catch e as Exception 'ログファイル出力 End Try End Sub 呼び出されるメソッド Public Sub Timer1() try FileOpen(1,"ファイルパス",OpenMode.Input) if Trim(LineInput(1)) = "" Then FileClose(1) Throw New Exception End If Catch e as Exception    'ログファイル出力 End Try End Sub

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class

  • Javaについて質問します。

    全員のjudgeBMIの適用結果を表示させたいのですが 下から4行目のcalcBMIにエラーが出てしまいます。 どこを修正すればいいかわからなく困っています。 わかる方いましたら教えていただきたく質問しました。 public class Enshu14_3 { private static double calcBMI(double weights, double heights){ return(weights/(heights*heights)); } private static String judgeBMI(double bmi){ String result; if(bmi<18.5){ result="やせ"; }else if(30.0<=bmi){ result="高度肥満"; }else if(25.0<=bmi){ result="肥満"; }else{ result="標準"; } return result; } public static void main(String[] args){ double[] weights = {64.0,51.5,70.2,58.3,85.4}; double[] heights = {1.65,1.67,1.66,1.75,1.68}; for(int i=0; i<weights.length; i++){ System.out.println(i+"番目の人は"+judgeBMI(calcBMI(weights,heights))+"です。"); } } }

  • VB.NETでXMLの読み込みを行うと例外エラーが出てしまい大変困って

    VB.NETでXMLの読み込みを行うと例外エラーが出てしまい大変困っています。どなたかお願いします。 Protected Sub Button4_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button4.Click Dim FILENAME As String FILENAME = "C:\\TEST\" If i = 1 Then FILENAME = FILENAME & "AAA\111.xml" Call testmethod(FILENAME) ElseIf i = 2 Then FILENAME = FILENAME & "BBB\222.xml" Call testmethod(FILENAME) End If End Sub Private Sub testmethod(ByVal FILENAME) If File.Exists(FILENAME) Then Dim xlr As XmlTextReader xlr = New XmlTextReader(FILENAME) While xlr.Read() Select Case xlr.LocalName Case "Personal" TextBox1.Text = xlr.ReadString Case "LastUpdate" Label1.Text = xlr.ReadString End Select End While xlr.Close() End If End Sub こんな感じでコードを書いているのですがWhile xlr.Read()のところで例外エラーが出てしまいます。 原因が全然つかめず困っています。 New XmlTextReader(FILENAME)のFILENAMEを変数でなく直接パスを書くとうまくいくのですが変数にするとなぜかハンドリングできなくなります。 どなたかご解説お願いします。

専門家に質問してみよう