レアな例外で落ちた。

仕事上で初めて出会った例外。レアな感じので、メモっておこうと。
using System;
using System.Collections.Generic;

namespace TawamureDays {

/// <summary>
/// 基底クラス
/// </summary>
/// <typeparam name="T">アイテムの型宣言</typeparam>
public class BaseClass<T> {

/// <summary>
/// コンストラクタ
/// </summary>
public BaseClass() {
ItetaredList = new List<T>(10);
}

/// <summary>リスト</summary>
public List<T> ItetaredList {get; set;}

/// <summary>
/// リスト内のアイテムを取得するためのシーケンスを取得します。
/// </summary>
/// <returns>シーケンス</returns>
public virtual IEnumerable<T> GetItems() {
foreach (var elem in ItetaredList) {
yield return elem;
}
}

}

/// <summary>
/// 継承したサブクラス(落ちる方)
/// </summary>
public class SubClass1 : BaseClass<string> {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public SubClass1() : base() {
}

#endregion

#region BaseClass<string>メンバ

/// <summary>
/// リスト内のアイテムを取得するためのシーケンスを取得します。
/// </summary>
/// <returns>シーケンス</returns>
public override IEnumerable<string> GetItems() {
foreach (var elem in base.GetItems()) {
yield return elem;
}
}


#endregion
}
}
以下のコードは、確実に落ちる。

var subClass = new SubClass1();
subClass.ItetaredList.Add("1");
subClass.ItetaredList.Add("2");
subClass.ItetaredList.Add("3");
subClass.ItetaredList.Add("4");

foreach (var elem in subClass.GetItems()) {
Console.WriteLine(elem.ToString());
}
仕事で書いたコードは、もっと複雑なんだけど、落ちる箇所を抜粋すると、だいたいこんな感じ。
発生する例外は、BadImageFormatExceptionというやつ。BadImageFormat?画像系?とか思ったけど、違うっぽい。

この例外は、ダイナミック リンク ライブラリ (.DLL ファイル) または実行可能ファイル (.exe ファイル) のファイル形式が、共通言語ランタイムで予期されている形式に準拠していない場合にスローされます。 特に、この例外は次の条件に該当する場合にスローされます。

なんかこう、発生した例外が自分のイメージと違うなぁとか思ってしまった。
基底クラスはGeneric、継承クラスは非Genericなときに、baseメソッドを呼び出すのはまずいのかもしれない。
(追記)
これは単に自分の理解不足から出た例外なんだけど、こういう各開発者個人の情報(バグ、ノウハウ)って、なかなか共有する方法ってないんだよなと。バグトラッキングとかそれに準ずるアプリがあったとしても、開発者一人では意味がなく、開発者全員がそれを使って蓄積する必要がある。蓄積できるようになったとしても、今度はそれを素早く検索できるようにならないと、いざというとき使えない。蓄積しやすく、検索しやすい。そんなアプリやシステム構成も考えていければなぁと思った。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m