«On Error Resume Next» разрешает «Встроенную обработку ошибок», которая является обработкой ошибок экспертного уровня в VB.Концепция состоит в том, чтобы обрабатывать ошибки построчно, либо выполняя действие, основанное на ошибке, либо игнорируя ошибку, когда это выгодно, - но запуская код в той последовательности, в которой он написан, и не используя переходы кода.
К сожалению, многие новички использовали «On Error Resume Next», чтобы скрыть свою неспособность или лень от тех, кто использует свои приложения, игнорируя все ошибки.Try/catch
- обработка ошибок на уровне блоков, которая в мире до .NET была промежуточной по дизайну и реализации.
Проблема с «On Error Resume Next» в VB.NET заключается в том, что он загружает объект err в каждую строку исполняемого кода и, следовательно, медленнее, чем try/catch
.Я несколько встревожен, что этот форум проверил и продвинул бессмысленный ответ, который утверждал, что использование On Error Resume Next - плохая привычка и мусор кода.Это форум C #;действительно ли это нужно для программистов C # делать снимки на другом языке, в котором они плохо разбираются?
https://msdn.microsoft.com/en-us/library/aa242093(v=vs.60).aspx
Говорят, что программисты среднего уровня C #, не имеющие реального опыта работы с VB, не должны пытаться держать C # в подавленном состоянии и ограничивать функциональность из-за своего странного презрения к другой «Microsoft Net»язык, рассмотрим следующий код:
//-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
'Pull Xml from file And dynamically create a dataset.
Dim strXML As String = File.ReadAllText("SomeFilePath.xml")
Dim srXmL As StringReader = New StringReader(strXML)
Dim dsXML As DataSet = New DataSet()
dsXML.ReadXml(srXmL)
'Any error above will kill processing. I can ignore the first two errors and only need to worry about dataset loading the XML.
If Err.Number <> 0 Then
MsgBox(Err.Number & Space(1) & Err.Description)
Exit Sub 'Or Function
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()
В приведенном выше коде необходимо было обработать только одну возможнуюсостояние ошибки;хотя до обработки третьей ошибки было две ошибки.Требуется разработка RAD On Error Resume Next.C # - мой выбор языков, но по многим причинам он не такой RAD, как VB.Я надеюсь, что все программисты понимают, что несколько основных языков (например, 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 функция lambda проверяет существование каждой таблицыстрока, строка, столбец, извлекаемая из набора данных, который динамически заполняется XML.Это можно проверять построчно, но для этого потребуется много избыточного кода (здесь мы выполняем тот же объем кода, но гораздо меньше написанного кода для поддержки).К сожалению, это можно считать еще одной плохой практикой «функций одной линии».Я нарушаю это правило в случае с лямбдами и анонимными функциями.
Поскольку .NET предлагает так много способов проверить состояние объектов;On Error Resume Next не так важна для экспертов VB, как это было до .NET, но все же приятно иметь ее;особенно когда вы кодируете что-то, что было бы пустой тратой времени, чтобы не писать код быстро и грязно.Вам Java конвертирует в C #;присоединяйтесь к миру Microsoft и перестаньте притворяться, что если 10000 промежуточных программистов на Java и C # говорят это, то это должно быть правдой, потому что если один из высокопоставленных Microsoft Guru (например, любой из тех, кто создал язык VB и .NET) явно противоречитих разработка .NET сама по себе, это ложь, а ты выглядишь глупо.Мне нужны все функциональные возможности, которые я могу получить в C #, VB, F # и любом другом языке, который мне нужно использовать.C # элегантен, но VB более развит, потому что он намного дольше, но они оба делают «То же самое» и используют одни и те же объекты.Изучите их обоих хорошо или, пожалуйста, воздержитесь от комментариев в разговорах сравнения;это тошнотворно для тех из нас, кто был с середины девяностых, используя технологии Microsoft на высоком уровне.