«При повторном повторном включении» позволяет использовать «Inline Error Handling», которая является обработкой ошибок уровня эксперта в VB. Концепция состоит в том, чтобы обрабатывать ошибки по очереди, либо выполняя действие на основе ошибки, либо игнорируя ошибку, когда она полезна, но работает в последовательности, в которой она написана, и не использует переходы кода.
К сожалению, многие новички использовали «On Error Resume Next», чтобы скрыть либо их недостаток, либо из-за лени от тех, кто использует свои приложения, игнорируя все ошибки.Try/catch
- обработка ошибок на уровне блоков, которая в мире pre -.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 позволит мне просто игнорировать ошибку, и мне не нужно будет кодировать каждую строку кода, устанавливая переменные, проверяющие наличие комбинации таблиц, строк и столбцов с методами Содержит. Это небольшой пример; Я мог бы вытащить тысячи комбинаций таблиц, столбцов, строк из больших файлов. Также предположим, что строковые переменные должны быть заполнены таким образом. Это необработанный код, и будут проблемы.
Рассмотрим VB.NET и On Error Resume Next: Реализация
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. 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/поймать блок, функция лямбда проверки существования каждой таблицы, строки , комбинацию столбцов, которая извлекается из набора данных, который динамически заполнялся xml. Это можно проверить по строкам, но для этого потребуется много избыточного кода (здесь у нас одинаковое количество исполняемого кода, но гораздо меньше написанного кода для поддержки). К сожалению, это может считаться еще одной плохой практикой «One Line Functions». Я нарушаю это правило в случае лямбда и анонимных функций.
Поскольку .NET предлагает так много способов проверить состояние объектов; On Error Resume Next не так важен для экспертов VB, как это было до .NET, но все же приятно иметь вокруг; особенно когда вы кодируете что-то, что будет пустой тратой времени, чтобы не закодировать быстро и грязно. Для вас Java конвертируется в C#; присоединиться к миру Microsoft и перестать притворяться, что если это говорят 10000 промежуточных программистов на Java и C#, это должно быть правдой, потому что, если один из главных гуру Microsoft Guru (например, любой из тех, кто создал язык VB и .NET), явно противоречит вам их развитие.NET, это неверно, и вы выглядите глупо. Я хочу всю функциональность, которую я могу получить на C# и VB и F #, и на любой другой язык, который мне нужно использовать. C# является элегантным, но VB более развит из-за того, что он намного длиннее, но они оба делают «Same Thing» и используют одни и те же объекты. Изучите их как хорошо, так и, пожалуйста, прокомментируйте либо в сравнении разговоров; это тошнотворно для тех из нас, кто был с середины девяностых, используя технологии Microsoft на высоком уровне.
Отсутствие альтернативы 'On Error Resume Следующий »был не просто непреднамеренным наблюдением ... Почему ты * возможно, нуждаешься в этом? Если вы объясните мотивацию своих размышлений об этом, я уверен, что кто-то здесь может дать вам лучшее решение. –
@Cody Grey - обновлена причина запроса. Спасибо – Neel
@Michael Shimmins - спасибо – Neel