2013-03-26 14 views
7

Recentemente ho guardato alcuni codici sul web. Ho trovato alcune persone usano la classe Microsoft.VisualBasic.CompilerServices.ProjectData.ProjectData nel blocco catch.Perché le persone usano ProjectData

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

ho cercato su MSDN che ha detto che questa API supporta l'infrastruttura .NET Framework e non deve essere utilizzata direttamente dal codice.

Sono curioso di sapere perché la gente lo usa. Me lo spiegherai?

+0

a prima vista, credo che l'autore stia cercando di impostare questa eccezione come errore VB interno. la domanda dovrebbe forse andare all'autore del codice a cui ti riferisci. – Dhawalk

+0

Se decompilate un assembly costruito in VB usando un riflettore, scoprirete che il compilatore VB inietta silenziosamente molte di tali chiamate –

risposta

7

La mia esperienza è stata che questo tipo di utilizzo del codice si trova nei progetti C#/VB.NET che sono stati convertiti da VB6. Quando si sviluppano nuove soluzioni/progetti C#/VB.NET, questa pratica non dovrebbe essere utilizzata.

Nota: questa tecnica può essere tranquillamente sostituita con un'appropriata gestione delle eccezioni che si sarebbe abituati a vedere in altre soluzioni/progetti .NET.

2

Questo codice viene emesso da uno strumento di conversione del codice che ha convertito il codice VB in C# o è risultato dalla decompilazione di un assembly creato originariamente utilizzando VB.

che sto porting di un progetto VB per Mono, e abbiamo scoperto che il compilatore VB inietta queste chiamate ProjectData.SetProjectError(exception) e ProjectData.ClearProjectError() in qualsiasi blocco catch, e cercare di trovare un modo per evitare che il compilatore di farlo perché non lo fa Mono implementare il modulo ProjectData. E ho trovato la tua domanda mentre facevo la mia ricerca!

0

quindi questo è un risultato del vecchio legacy vb6 per chi fosse interessato. quando è iniziato vb6, c'era un oggetto err che è ancora in circolazione ma è stato spostato nell'oggetto projectdata in vb. se qualcuno come me si ricorda di vb6 (questo è tornato quando i dinosauri vagavano per la terra), c'è stata una piccola chiamata a portata di mano per riprendere il prossimo errore. questo è se non ti piacessero quelle piccole eccezioni fastidiose. la maggior parte dei programmi vb6 la usavano copiosamente e voilà non avevi eccezioni perché ne ignoravi qualcuno. quindi ecco la spiegazione.

catch (Exception exception1) // catturare tutte le eccezioni che appena accaduto

{ 

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

// nell'oggetto Err se qualcuno vuole realmente controllare

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

come si può vedere questo è completamente ignorando eventuali eccezioni e in modo vb6 vero, il tuo codice esplode senza alcuna spiegazione. inutile dire se qualcuno scrive codice come questo o usa vb in questo modo, ti troverò e cercherò un modo per farti incarcerare.

Problemi correlati