>  > SPEEDBRAKES スピードブレークス フロントブレーキホース【FRONT BRAKE HOSE】【ヨーロッパ直輸入品】 Color:Titanium GSX1340R HAYABUSA (1340) 08 13-14
[Atelier Blue アトリエブルー]17インチ サマータイヤ セット【アテンザスポーツ(GH系 18インチ装着車)】MANARAY ヴァーテックワン ロングビーク メタリックブラック/リムDC/アンダーカットポリッシュ 7.0Jx17VEURO VE303 215/50R17SWAGE-LINE スウェッジライン フロント ブレーキホースキット ホースの長さ:150mmロング ホースカラー:スモーク ER-6nManaged DirectX3D>番外:Direct3Dの例外基礎

SPEEDBRAKES スピードブレークス フロントブレーキホース【FRONT BRAKE HOSE】【ヨーロッパ直輸入品】 Color:Titanium GSX1340R HAYABUSA (1340) 08 13-14

.Netにおいて重要になった例外。Managed DirectXでも、例外を利用しています。今回は今までのコードについて例外という観点から色々と見ていきましょう。

SPEEDBRAKES スピードブレークス フロントブレーキホース【FRONT BRAKE HOSE】【ヨーロッパ直輸入品】 Color:Titanium ADVAN GSX1340R HAYABUSA (1340) 08 Parking 13-14

とりあえず、Direct3Dに関する例外一覧です。

Microsoft.DirectX.Direct3D.DirectXException
//DirectX全般の基底例外クラス。
 Direct3D.Direct3DXException
 //D3DXの基底例外クラス。
 CannotAttributeSortException
 //最適化テクニックとして属性のソートはサポートされていません
 CannotModifyIndexBufferException
 //インデックスバッファを変更できません
 DuplicateNamedFragmentException
 //名前付きフラグメントが重複しています。
 InvalidDataException
 //データが無効です。
 InvalidMeshException
 //メッシュが無効です。
 LoadedMeshHasNoDataException
 //メッシュにデータが含まれていません。
 SkinningNotSupportedException
 //スキニングががサポートされていない。
 TooManyInfluencesException
 //指定された影響が多すぎる。
 Direct3D.GraphicsException
 //グラフィックスの基底例外クラス シビック FD1-3   スタビライザー / フロント【クスコ】シビック FD2 スタビライザー フロント。
 ConflictingRenderStateException
 //現在設定されているレンダーステートは同時に使う事は出来ません
 ConflictingTextureFilterException
 //現在のテクスチャフィルタを同時に使う事は出来ません
 ConflictingTexturePaletteException
 //現在のテクスチャを同時に使う事は出来ません
 DeviceLostException
 //デバイスはは消失しているが、現在はリセットできません。
 //したがってレンダリングは不可能です。
 DeviceNotResetException
 //デバイスは消失しているのが、現在リセットできます。
 DriverInternalErrorException
 //内部ドライバエラー。通常、このエラーを受け取った場合には、
 //アプリケーションはシャットダウンする必要があります。
 DriverInvalidCallException
 //現在のメソッド呼び出しが無効である事をドライバが報告します。
 InvalidCallException
 //メソッド呼び出しが無効です。
 //たとえばメソッドのパラメータが無効である場合があります。
 InvalidDeviceException
 //要求されたデバイスの種類が無効です 。
 MoreDataException
 //指定されたバッファサイズで保持できる以上のデータが存在する。
 NotAvailableException
 //このデバイスは、問い合わされたテクニックをサポートしない。
 NotFoundException
 //要求された項目が見つからなかった。
 OutOfVideoMemoryException
 //Direct3Dが処理を行うのに十分なディスプレイメモリがない。
 TooManyOperationsException
 //デバイスがサポートしている数より多くテクスチャフィルタリング処理を、
 //アプリケーションが要求している。
 UnsupportedAlphaArgumentException
 //アルファチャンネルに指定されているブレンディング引数を、
 //デバイスがサポートしていない
 UnsupportedAlphaOperationException
 //アルファチャンネルに対して指定されているテクスチャブレンディング処理を、
 //デバイスがサポートしていない。
 UnsupportedColorArgumentException
 //色値に対して指定されているテクスチャブレンディング引数を
 //デバイスがサポートしてない。
 UnsupportedColorOperationException
 //色値に対して指定されているテクスチャブレンディング処理を、
 //デバイスがサポートしてない。
 UnsupportedFactorValueException
 //デバイスが指定されたテクスチャ係数値をサポートしていない。
 UnsupportedTextureFilterException
 //デバイスが指定されたテクスチャフィルタをサポートしてない。
 WasStillDrawingException
 //デバイス描画中であった。
 WrongTextureFormatException
 //テクスチャサーフェイスのピクセルフォーマットが無効である 【送料無料】 215/45R18 18インチ CEC C883 7J 7.00-18 SAFFIRO サフィーロ SF5000(限定) サマータイヤ ホイール4本セット フジコーポレーション。

 
 

いくつか代表的なものを取り上げてみましょう。

DeviceLostException
//デバイスはは消失しているが、現在はリセットできません。
//したがってレンダリングは不可能です。

SPEEDBRAKES スピードブレークス フロントブレーキホース【FRONT BRAKE HOSE】【ヨーロッパ直輸入品】 Color:Titanium GSX1340R HAYABUSA (1340) 08 13-14最終入荷!お見逃しなく!


エンドレス SSY フロント左右セット ブレーキパッド サニー HB310/KHB310/PB310/WHB310/KPB310 EP011 ENDLESS ブレーキパット【店頭受取対応商品】


SPEEDBRAKES スピードブレークス フロントブレーキホース【FRONT BRAKE HOSE】【ヨーロッパ直輸入品】 Color:Titanium GSX1340R HAYABUSA (1340) 08 13-14 SADDLEMEN サドルメン シート本体 SEAT KNUCKLE 2UP [0802-0827]

↓↓↓『ビアンテ』 純正 CCFFW シートバックバスケット(抗菌・防臭・防水機能付) パーツ マツダ純正部品 BIANTE オプション アクセサリー 用品;VTR1000F(97~02年) 段付きスクリーン スモーク MAGICAL RACING(マジカルレーシング);クニペックス KNIPEX ディスプレイボックスセット (8701-250X10丁) 001919V02-KP JP店, 【エントリーでポイント5倍】145/80R12 86/84N TOYO TIRES トーヨー タイヤ V02e ブイゼロツーイー TRG-SS10 TRG SS10 サマータイヤホイール4本セット, スバル ステラ ブレーキシュー ブレーキシュー RGMタイプ リア用 LA160F ステラ (14/12~)RGM3850092 【送料無料】【DIXCEL】ポイント5倍【ディクセル】, 【イベント開催中!】 SCORPION スコーピオン セルケトテーパー (SERKET TAPER SILENCERS) スリップオンマフラー 素材:ステンレススチール(Stainless Steel) ZX-10R, RSタイチ RSR045 UBCM/L DRYMASTER RAIN SUITS レインスーツ 4997035682805;【USA在庫あり】 クリアキン COVER STATOR SCOUT CHR 2110-0957 HD店 カードでポイント最大34倍 3/21(木)20:00~3/26(火)1:59迄 YOKOHAMA ヨコハマ エコス ECOS ES31 サマータイヤ 225/55R17 MONZA R VERSION sprint ホイールセット 4本 17 X 7 +38 5穴 114.3↓↓↓[ACRE] アクレ ブレーキパッド フォーミュラ700C リア用 カルディナ AZT241W AZT246W 02/9~07/7 2000cc ※代引不可 ※北海道・沖縄・離島は送料2160円, OKADA PROJECTS プラズマダイレクト トヨタ カローラランクス/フィルダー NZE121/124(G) 1NZ-FE H16.4-H18.9 SD204081R, 【送料無料】 225/70R16 16インチ MLJ エクストリームJ XJ04 7J 7.00-16 YOKOHAMA ヨコハマ ジオランダー SUV G055 サマータイヤ ホイール4本セット, 『インプレッサ』 純正 GP2 バックセンサー(リア4センサー) パーツ スバル純正部品 危険通知 接触防止 障害物コーナーセンサー 障害物 impreza オプション アクセサリー 用品, KOYORAD コーヨー レーシングラジエーター(MT用) TYPE-M KV081578R


↓↓↓↓↓↓↓↓↓↓↓↓

柿本改 KRノーブルエリッセ クリスタルAB マフラー レガシィB4 TA/ABA-BL5 B51315B 取付セット KAKIMOTO RACING 柿本 KR noble EllisseクリスタルAB スポーツマフラー【店頭受取対応商品】, 車高調 RS-R マツダ アテンザワゴン GJ2FW (FF) 24/11~26/12 Best☆i BIM560M, 【代引不可】Clazzio(クラッツィオ):シートカバー(ネオ)(アイボリー) トヨタ アルファード HV/ヴェルファイア HV 30系 7人 ET-1520, 【関西、関東限定】取付サービス品GRB/GRF インプレッサハッチバック STI フロントバンパー【バリス】IMPREZA GRB STi (A・B) FRONT SOILER ノ-マルバンパ-専用 F.R.P, RS-R RSR Ti2000 DOWN ミニカトッポBJ H42A RS-R B004TDF フロント RS-R RSR

カワサキ純正 キット シングル シート イエロー 99994-0354-35E JP店;「複数種類あり」 リヤ バツクレスト の カバー コンプリート ■ 『図の略番 64350 のみ』 スバル純正部品 サンバー 適合年式[平成10年08月~24年02月]『品番』 64350TC200 ^j34^ プロジェクトμ クラブマン・シンタード フロント左右セット ブレーキパッド スカイラインGT-R BNR34 F206 プロジェクトミュー プロミュー プロμ CLUBMAN SINTERED ブレーキパット【店頭受取対応商品】 テラノレグラス フロントバンパー【エルフォード】REGULUS QX4 エアロマスク タイプ1;【送料無料】 PIRELLI ピレリ P-ZERO B BENTLEY承認 255/40R20 101Y タイヤ単品1本価格

カードでポイント最大34倍 3/21(木)20:00~3/26(火)1:59迄 ブリヂストン DUELER デューラー H/L 850 サマータイヤ ● 215/60R17 WEDS ウェッズ RIZLEY ライツレー ZM ホイールセット 4本 17インチ 17 X 7 +53 5穴 114.3;鬼爆閃光NCP/NLP5#系 プロボックス前期 [H14.7~H17.7]LEDウインカー球前後セットA+8ピンウイポジ機能付ハイフラ防止ICウインカーリレーウインカー ウィンカー 電球 方向指示器 LEDウインカー

。 DeviceNotResetException //デバイスは消失しているのが、現在リセットできます。 DriverInternalErrorException //内部ドライバエラー。通常、このエラーを受け取った場合には、 //アプリケーションはシャットダウンする必要があります。 DriverInvalidCallException //現在のメソッド呼び出しが無効である事をドライバが報告します。 InvalidCallException //メソッド呼び出しが無効です。 //たとえばメソッドのパラメータが無効である場合があります。 InvalidDeviceException //要求されたデバイスの種類が無効です。 //要求された項目が見つからなかった。 OutOfVideoMemoryException //Direct3Dが処理を行うのに十分なディスプレイメモリがない。

特に「DriverInvalidCallException」は色々なメソッドから返される例外です。

例外への対処法

まず第一に、継承元の例外でキャッチしない。という事です。Direct3Dの例外の中には「DriverInternalErrorException」のように。速やかに終了すべき例外もあります。そのため、例外は必要最小限だけをキャッチするようにしましょう。

二つ目に、例外の伝播はboolなどでなく例外ですること。ただし、その例外の原因を取り除いた場合はその限りではありません。これは、例外を無視してしまわないようにするための方法です。無視して構わない例外であれば、そのようにしても良いです 【メーカー在庫あり】 ユーカナヤ U-KANAYA ビレットレバーセット 可倒式Rタイプ 06年以降 GSR750、GSR600、GSR400 緑 SU006-035-0707 JP店。

サンプルコード

次が、上にしたがって作られたコードの例です。

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace Project2
{
 /// <summary>
 /// md3d2 の概要の説明です。
 /// </summary>
 public class md3d2:Form
 {
 public md3d2():base()
 {
 this.MinimumSize=new Size(80,60);
 this.ClientSize = new Size(300,300);
 this.Text ="Direct3D-My";
 }
 /// <summary>
 /// Direct3Dのデバイス
 /// </summary>
 private Device device_;
 /// <summary>
 /// 表示のための設定
 /// </summary>
 private PresentParameters presentParam_;
 /// <summary>
 /// 立方体メッシュ
 /// </summary>
 private Mesh teaMesh_;
 /// <summary>
 /// Direct3Dの初期化を行います。
 /// </summary>
 public void DXInitialize()
 {
 presentParam_ = new PresentParameters();
 presentParam_.Windowed =true;
 presentParam_.SwapEffect = SwapEffect.Discard;
 presentParam_.AutoDepthStencilFormat =DepthFormat.D16;
 presentParam_.EnableAutoDepthStencil=true;
 try {
 MessageBox.Show("A");
 device_ = new Device(0,DeviceType.Hardware,this
 ,CreateFlags.HardwareVertexProcessing,presentParam_);
 }
 catch(InvalidCallException)
 {
 try {
 MessageBox.Show("A");
 device_ = new Device(0,DeviceType.Hardware,this
 ,CreateFlags.SoftwareVertexProcessing,presentParam_);
 }
 catch(InvalidCallException)
 {
 try{
 MessageBox.Show("A");
 device_ = new Device(0,DeviceType.Reference,this
 ,CreateFlags.SoftwareVertexProcessing,
 presentParam_);
 }
 catch(InvalidCallException ex)
 {
 MessageBox.Show("C");
 throw new FatalException(
 "Direct3Dのデバイスを作成できませんでした。",ex);
 }
 }
 }
 device_.RenderState.ZBufferEnable = true;
 device_.RenderState.ZBufferWriteEnable = true;
 try {
 creatMesh();
 }
 catch(OutOfMemoryException ex)
 {
 throw new FatalException("メッシュの作成に失敗しました。",ex);
 }
 }
 /// <summary>
 /// メッシュを作成する
 /// </summary>
 private void creatMesh()
 {
 teaMesh_ = Mesh.Teapot(device_);
 }
 /// <summary>
 /// 描画設定
 /// </summary>
 private void renderSetting()
 {
 device_.Transform.Projection =
 Matrix.PerspectiveFovLH((float)Math.PI / 4,
 (float)this.ClientSize.Width / (float)this.ClientSize.Height,
 0.0f, 15.0f);
 //カメラの設定を行う
 device_.Transform.View = Matrix.LookAtLH(
 new Vector3( 4.0f, 0.0f, 0.0f ),
 new Vector3( 0.0f, 0.0f, 0.0f ),
 new Vector3( 0.0f, 1.0f, 0.0f ) );
 //回転
 device_.Transform.World = Matrix.RotationY(Environment.TickCount/1500f);
 device_.RenderState.Lighting=false;
 //ワイヤーフレームモードに
 device_.RenderState.FillMode = FillMode.WireFrame;
 //背面カリングなし
 device_.RenderState.CullMode = Cull.None;
 }
 public void Render()
 {
 if(device_==null)return;
 if(this.WindowState ==FormWindowState.Minimized)return;
 renderSetting();
 device_.Clear(ClearFlags.Target|ClearFlags.ZBuffer,
 Color.Blue,1.0f,0);
 device_.Clear(ClearFlags.Target,
 Color.Blue,1.0f,0);
 device_.BeginScene();
 teaMesh_.DrawSubset(0);
 device_.EndScene();
 try {
 device_.Present();
 }
 catch(DeviceLostException)
 {
 resetDevice();
 }
 }
 /// <summary>
 /// デバイスのリセットを行う
 /// </summary>
 private void resetDevice()
 {
 int result;
 if(!device_.CheckCooperativeLevel(out result))
 {
 if(result ==(int)ResultCode.DeviceLost)
 {
 //ちょっと待つ
 System.Threading.Thread.Sleep(10);
 }
 else if(result ==(int)ResultCode.DeviceNotReset)
 {
 device_.Reset(presentParam_);
 }
 }
 }
 protected override void Dispose(bool disposing)
 {
 if(teaMesh_ !=null)
 {
 teaMesh_.Dispose();
 }
 if(device_ != null)
 {
 device_.Dispose();
 }
 base.Dispose (disposing);
 }
 }
 /// <summary>
 /// エントリクラス
 /// </summary>
 class Program
 {
 public static void Main()
 {
 try {
 using(md3d2 dxform =new md3d2())
 {
 try {
 dxform.DXInitialize();
 }
 catch(FatalException ex)
 {
 MessageBox.Show("Diret3Dの初期化に失敗しました。\r\n"
 + ex.ToString(),"初期化の失敗",MessageBoxButtons.OK,
 MessageBoxIcon.Error);
 return;
 }
 dxform.Show();
 while(dxform.Created)
 {
 dxform.Render();
 Application.DoEvents();
 }
 }
 }
 catch(DriverInternalErrorException ex)
 {
 MessageBox.Show("ドライバ内部でエラーが発生しました。\r\n"
 + ex.ToString(),"不明な失敗",MessageBoxButtons.OK,
 MessageBoxIcon.Error);
 }
 }
 }
 /// <summary>
 /// 致命的なエラーを表す。打つ手がないため、速やかに終了する事。
 /// </summary>
 class FatalException:Exception
 {
 public FatalException():base(){}
 public FatalException(string message):base(message){}
 public FatalException(string message,Exception innerException)
 :base(message,innerException){}
 }
}

 
 

それでは説明していきましょう。

Color:Titanium Color:Titanium フロントブレーキホース【FRONT SPEEDBRAKES (1340) 08 08 HOSE】【ヨーロッパ直輸入品】 GSX1340R BRAKE スピードブレークス 13-14 HAYABUSA

今回、独自の例外として「FatalException」というものを定義しました。これは、それ以上実行する意味がない場合や、実行にたどり着けなかった場合にスローされる例外です。

今回のコードは、ティーポッドをワイヤーフレームで表示するプログラムです。そのため、それをなしえない場合には「FatalException」となります。

デバイスの作成

「new device()」はいくつかの例外を発生させます。

  • DeviceLostException
  • InvalidCallException
  • NotAvailableException
  • OutOfVideoMemoryException

サンプルコードでは、「InvalidCallException」の場合のみ「Hardware-HardwareVertexProcessing」「Hardware-SoftwareVertexProcessing」「Reference-SoftwareVertexProcessing」の順番で作成を試みています。これは、前提条件として「十分なメモリを持ち、不測の事態が起きない環境を想定」しているためです。この前提の中でデバイスの作成に失敗した時(つまり「InvalidCallException」がスローされた時)に限り例外の回復を試みています。

また、これらすべてに失敗した時には「前提条件の中で致命的な状態にったった」と判断され「FatalException」がスローされます。

ここで重要なのは、どのような場合には例外の復旧が可能かという事です。今回に限っては他の三つの例外についても「Reference-SoftwareVertexProcessing」をためす価値はあります。ですが、そこまでの面倒は見きれないという事で、それらは切り捨てています。

特にDeviceLostExceptionは安定した環境でも起こりえると思います。初期化途中でビデオメモリとの接続が切れる事は結構あると思います。

メッシュの作成

メッシュの作成では次の例外が発生します。

  • InvalidCallException
  • InvalidDataException
  • OutOfVideoMemoryException

サンプルでは「OutOfVideoMemoryException」以外の例外を考えていません。Meshの作成時にメモリが足りなくなる事は考えられる事態です。また、この場合にはもっとメモリ使用量の少ない方法に切り替える事も考えられます(サンプルではすぐに終了します)。

ですが、その他の例外が出る場合はバグであると考えられます。そのため、この例外はキャッチしません。根本的なバグの発見に役立つ情報を止めないようにするためにも大きな範囲の例外をキャッチするのは控えるようにしましょう。

また、その二つの例外がバグ以外の原因ででた場合にもキャッチする利益はありません。対処できないからです。

エントリポイント内での例外キャッチ

エントリポイント内では一番外側で、「DriverInternalErrorException」をキャッチしています。これ以外には自作した「FatalException」しかキャッチしていません。

まず、DriverInternalErrorExceptionをキャッチする理由です。この例外はキャッチした時点で狩猟のコードを書く事になります。例外の復旧を試みる意味はありません。そのため、明示的に終了のコードを書いています。

次に「FatalException」これも、終了する事を求められる例外です。そのため、明示的にキャッチしています。

そのほかの例外については「キャッチする意味がない(復旧出来ない、キャッチしても再スローを行うだけ)」「発生してはいけない例外である」「前提条件に反する」の三つに当てはまるためキャッチしていません。

ただし、このコードはテスト用プログラムの例外構造としてあるものです。公開する場合には一番外側にもう一段例外キャッチを設けてログをとるなりの対応はすべきだと思います。

ただ、その対応は例外に対する原則に反するものではありません。そこでキャッチするのには意味があるからです。例外はエラーではないですが、それが野放しのままユーザーにさらされるのはバグであると思います。のバグを減らすために例外をキャッチするというわけです。

まとめ

この例外処理の仕方は、自分がプログラムを公開する時にはそうするだろうというものをまとめただけに過ぎません。その人独自の考え方もあるでしょうし、これがベストだとも限らないからです(でも、そうだと良いなと思って書いてはいます)。

例外の良い点は、無視できない点とメソッドをまたぐ点だと思います 【送料無料】 225/65R17 17インチ 5ZIGEN ゴジゲン ファイヤーボールダブルアール 8J 8.00-17 YOKOHAMA ヨコハマ ブルーアース RV-02 SALE サマータイヤ ホイール4本セット【YOsum19】。是非有効利用して下さい。


1文字からOK!【漢字・ひらがな・数字・アルファベット】45cmまで同価格!(40.5~45cm)屋外5年程度 文字シール ステッカー 車 オーダーメイド サーフィン バイク 看板 店舗名 ポスト 扉 スーツケース カッティングステッカー [◆]ページの一番上へ
一覧に戻る
初版2006-8-16
{yahoojp} {atelier-blue.com}
{yahoojp}jpprem01-zenjp40-wl-zd-80595