「OnErrorResumeNext」では、VBのエキスパートレベルのエラー処理である「インラインエラー処理」が可能です。概念は、エラーに基づいてアクションを実行するか、有益な場合はエラーを無視するかのいずれかで、エラーを1行ずつ処理することですが、コードを記述された順序で実行し、コードジャンプを使用しません。
残念ながら、多くの初心者は「On Error Resume Next」を使用して、すべてのエラーを無視することにより、アプリケーションを使用している人から能力の欠如または怠惰を隠しました。Try / catchはブロックレベルのエラー処理であり、.NET以前の世界では設計と実装によって中間的でした。
VB.NETの「OnErrorResumeNext」の問題は、実行中のコードのすべての行にerrオブジェクトが読み込まれるため、try/catchよりも遅いことです。
https://msdn.microsoft.com/en-us/library/aa242093(v=vs.60).aspx
実際のVBの経験がない中級のC#プログラマーは、別の「Microsoft Net」言語に対する奇妙な軽蔑のために、C#を唖然とさせ、機能を制限しようとすべきではないと言われています。次のコードを検討してください。
//-Pull xml from file and dynamically create a dataset.
string strXML = File.ReadAllText(@"SomeFilePath.xml");
StringReader sr = new StringReader(strXML);
DataSet dsXML = new DataSet();
dsXML.ReadXml(sr);
string str1 = dsXML.Tables["Table1"].Rows[0]["Field1"].ToString();
string str2 = dsXML.Tables["Table2"].Rows[0]["Field2"].ToStrin();
string str3 = dsXML.Tables["Table3"].Rows[0]["Field3"].ToStrin();
string str4 = dsXML.Tables["Table4"].Rows[0]["Field4"].ToString();
string str5 = dsXML.Tables["Table5"].Rows[0]["Field5"].ToString();
xmlが通常Field3の値を持っているが、そうでない場合もある場合。テーブルにフィールドが含まれていないという厄介なエラーが発生します。それが必要なデータではないので、そうでなければ私はあまり気にすることができませんでした。この場合、ON Error Resume Nextを使用すると、エラーを無視でき、Containsメソッドを使用してテーブル、行、列の組み合わせの存在を確認する変数を設定するコードの各行をコーディングする必要がなくなります。これは小さな例です。大きなファイルから何千ものテーブル、列、行の組み合わせを取り込む可能性があります。また、ここでは、文字列変数にこの方法でデータを入力する必要があると想定します。これは未処理のコードであり、問題が発生します。
VB.NETおよびONエラーを考慮して次の実装を再開します。
On Error Resume Next
Dim strXML As String = File.ReadAllText("SomeNonExistentFileCausingAnErrorCondition.xml")
If String.IsNullOrEmpty(strXML) Then
strXML = strSomeOtherValidXmlThatIUseWhenTheFileIsEmpty
End If
Dim srXmL As StringReader = New StringReader(strXML)
Dim dsXML As DataSet = New DataSet()
dsXML.ReadXml(srXmL)
If Err.Number <> 0 Then
MsgBox(Err.Number & Space(1) & Err.Description)
Exit Sub
End If
Dim str1 As String = dsXML.Tables("Table1").Rows(1)("Field1").ToString()
Dim str2 As String = dsXML.Tables("Table2").Rows(2)("Field2").ToString()
Dim str3 As String = dsXML.Tables("Table3").Rows(3)("Field3").ToString()
Dim str4 As String = dsXML.Tables("Table4").Rows(4)("Field4").ToString()
上記のコードでは、1つの考えられるエラー状態を処理するだけで済みました。ファイルのロード中にエラーが発生した場合でも。On Error Resume Nextを使用すると、実際に意図したとおりに再開でき、文字列の状態を確認して代替文字列を使用できました(ファイルの存在も確認して、ファイルエラーを回避できた可能性があることはよく知っていますが、それは何も入っていない良いファイルでした、strXMLは空の文字列になります)。ロードされたデータセットがそれ以降の残りの処理(必要に応じてエラーを無視して実行できる処理)にとって最も重要であったため、コードの残りの部分に重大なエラーが処理され、メソッドが終了しました。ファイルエラーを無視したか、エラー状態を確認してログに記録したため、ファイルエラーを無視できました。
RAD開発にはOnErrorResumeNextが必要です。C#は私の言語の選択ですが、多くの理由からVBほどRAD言語ではありません。すべてのプログラマーが、いくつかの主要な言語(つまり、C)が実行され、未処理のエラーで実行を停止しないことを理解してほしいと思います。必要と思われる場所でそれらをチェックするのは開発者の仕事です。On Error Resume Nextは、Microsoftの世界でそのパラダイムに最も近いものです。
幸いなことに、.NETはこれらの状況を処理するための多くの高度な選択肢を提供します。私は含むに逃げました。したがって、C#では、言語の知識レベルを強化する必要があり、C#言語仕様に従って、このような問題を適切に回避します。煩わしいスローアウェイエラーを含む可能性のあるコードの繰り返し行の大きなブロックを処理するためのソリューションを検討してください。
try
{
if (!File.Exists(@"SomeFilePath.xml")) { throw new Exception("XML File Was Not Found!"); }
string strXML = File.ReadAllText(@"SomeFilePath.xml");
StringReader sr = new StringReader(strXML);
DataSet dsXML = new DataSet();
dsXML.ReadXml(sr);
Func<string, string, int, string> GetFieldValue = (t, f, x) => (dsXML.Tables[t].Columns.Contains(f) && dsXML.Tables[t].Rows.Count >= x + 1) ? dsXML.Tables[t].Rows[x][f].ToString() : "";
//-Load data from dynamically created dataset into strings.
string str1 = GetFieldValue("Table1", "Field1", 0);
string str2 = GetFieldValue("Table2", "Field2", 0);
string str3 = GetFieldValue("Table3", "Field3", 0);
//-And so on.
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
try / catchブロックでは、ラムダ関数は、xmlによって動的に入力されたデータセットからプルされているすべてのテーブル、行、列の組み合わせの存在をチェックしています。これは行ごとにチェックできますが、多くの余分なコードが必要になります(ここでは、同じ量の実行コードがありますが、維持するために記述されたコードははるかに少なくなります)。残念ながら、これは「1行関数」のもう1つの悪い習慣と見なされる可能性があります。ラムダと無名関数の場合、私はそのルールを破ります。
.NETは、オブジェクトのステータスをチェックするための非常に多くの方法を提供しているため、On Error Resume Nextは、VBの専門家にとって、.NET以前ほど重要ではありませんが、それでも手元に置いておくと便利です。特に、速くて汚いコーディングをしないと時間の無駄になるようなものをコーディングしている場合はなおさらです。エキスパートレベルでVBを使用したことのある人は、On Error Resume Next(インラインエラー処理)が言語に追加された中で最悪の機能であると主張することはありません。しかし、それは初心者によって広く誤用されてきました。