2013-03-26 19 views
7

Ostatnio przyjrzałem się kodowaniu w Internecie. Zauważyłem, że niektórzy ludzie używają klasy Microsoft.VisualBasic.CompilerServices.ProjectData.ProjectData w bloku catch.Dlaczego ludzie używają ProjectData

catch (Exception exception1) 
     { 
      //ProjectData.SetProjectError(exception1); 
      Console.WriteLine(exception1.ToString()); 
      Console.WriteLine(); 
      Console.WriteLine(sSQL); 
      //ProjectData.ClearProjectError(); 
     } 

Szukałem go na MSDN że wspomniane, że ten interfejs API obsługuje infrastrukturę programu .NET Framework i nie jest przeznaczony do użycia bezpośrednio w kodzie.

Jestem ciekawy, z jakiego powodu ludzie go używają. Czy mógłbyś mi to wyjaśnić?

+0

na pierwszy rzut oka, uważam, że autor próbuje ustawić ten wyjątek jako wewnętrzny błąd VB. pytanie powinno iść do autora kodu, do którego się odnosisz. – Dhawalk

+0

Jeśli dekompilujesz zespół wbudowany w VB za pomocą reflektora, przekonasz się, że kompilator VB cicho wstrzykuje wiele takich wywołań –

Odpowiedz

7

Moje doświadczenie było takie, że ten typ wykorzystania kodu znajduje się w projektach C#/VB.NET, które zostały przekonwertowane z VB6. Podczas opracowywania nowych rozwiązań/projektów C#/VB.NET ta praktyka nie powinna być stosowana.

Uwaga: Tę technikę można bezpiecznie zastąpić odpowiednią obsługą wyjątków, z której można by się spotkać w innych rozwiązaniach/projektach .NET.

2

Ten kod jest wysyłany za pomocą narzędzia do konwersji kodu, które przekonwertowało kod VB na C# lub w wyniku dekompilacji zespołu, który został pierwotnie utworzony za pomocą VB.

Przenoszę projekt VB do Mono i dowiedziałem się, że kompilator VB wstrzykuje te wywołania ProjectData.SetProjectError(exception) i ProjectData.ClearProjectError() w dowolnym bloku catch i próbuje znaleźć sposób, aby zapobiec kompilacji, ponieważ Mono nie robi tego zaimplementuj moduł ProjectData. I znalazłem twoje pytanie podczas moich badań!

0

więc jest to wynik starszej wersji vb6 dla zainteresowanych. kiedy vb6 rozpoczęło się, był obiekt err, który wciąż jest w pobliżu, ale został przeniesiony do obiektu projectdata w vb. jeśli ktoś taki jak ja pamięta vb6 (to jest z powrotem, gdy dinozaury włóczyły się po ziemi), pojawiła się mała poręczna próba wznowienia błędu. to jest, jeśli nie lubisz tych brzydkich małych wyjątków. większość programów vb6 używała go obficie i voila nie miałeś żadnych wyjątków, ponieważ zignorowałeś je. oto wyjaśnienie.

catch (Exception exception1) // złapać żadnych wyjątków, które akurat

{ 

     ProjectData.SetProjectError(exception1); // set the information 

// w obiekcie err jeśli ktoś faktycznie chce sprawdzić

 ProjectData.ClearProjectError(); //clear the err object 
    } 

jak widać jest to całkowicie ignorując wszelkie wyjątki i w prawdziwym stylu vb6, twój kod właśnie wybucha bez żadnego wyjaśnienia. nie trzeba dodawać, że jeśli ktoś napisze taki kod lub używa vb w ten sposób, znajdę cię i wymyślę sposób, aby cię uwięzić.

Powiązane problemy