2008-10-24 11 views
6

Mam trochę kodu, który ignoruje określony wyjątek.Ignorowanie wyjątków

try 
{ 
    foreach (FileInfo fi in di.GetFiles()) 
    { 
     collection.Add(fi.Name); 
    } 
    foreach (DirectoryInfo d in di.GetDirectories()) 
    { 
     populateItems(collection, d); 
    } 
} 
catch (UnauthorizedAccessException ex) 
{ 
    //ignore and move onto next directory 
} 

oczywiście spowoduje to ostrzeżenie o czasie kompilacji, ponieważ nie jest używane. Czy istnieje jakiś standardowy punkt akceptacji, który powinien zostać użyty do usunięcia tego ostrzeżenia?

Odpowiedz

12

Wystarczy przepisać go jako

catch (UnauthorizedAccessException) {} 
+0

Nie miałem pojęcia, że ​​było to dopuszczalne, zręczne, dzięki. – stimms

+0

Ale proszę, dołącz komentarz!Tylko całkowicie pusty blok kodu produkcyjnego nie powinien przechodzić oceny kodu IMO. –

+0

> "Ale proszę, dołącz komentarz", ". Nie zgadzam się z tym. "catch (SomeException) {}" już wyraźnie mówi "ignoruj ​​SomeException" iw wielu przypadkach dodatkowy komentarz będzie zbędny. – Joe

1

zwykle zrobić

Debug.WriteLine(ex.message) 

(w ten sposób można po prostu ustawić punkt przerwania w wyjątku, w razie potrzeby, zbyt)

2

Jak Dave M i tvanfosson powiedział, chcesz przepisać go jako

catch (UnauthorizedAccessException) {} 

Najpoważniejsze pytanie, które należy zadać, to dlaczego łapiesz wyjątek, ignorując go (potocznie nazywa się połknięciem wyjątku)? Jest to generalnie zły pomysł, ponieważ może (i zazwyczaj powoduje) ukrywać problemy w aplikacji w czasie wykonywania, co może prowadzić do bardzo dziwnych wyników i trudnego czasu na ich debugowanie.

+0

Przynajmniej jest lepsze niż "catch (Exception) {}". – MusiGenesis

+0

Prawda, ale tylko nieznacznie lepsza. –

+0

Myślę, że czasami jest w porządku złapać wyjątek i połknąć go, ale zawsze powinien być komentarz wyjaśniający, dlaczego to robisz. –

-1

Mimo że jestem programistą Java (nie C#), @Scott Dorman ma absolutną rację. Dlaczego "połykasz wyjątek"? Jeszcze lepiej, co może wyrzucić nieautoryzowany wyjątek wyjątkowy? Oto możliwości common sense:

  1. Plik nie istnieje
  2. Katalog nie istnieje
  3. bieżącego wątku kontroli nie posiada odpowiednie uprawnienia zabezpieczeń. W świecie * nix bieżący wątek może znajdować się w niewłaściwej grupie lub niewłaściwym użytkowniku.
  4. Dysk uległa awarii
  5. Lista ACL pliku jest ustawiona tylko do zapisu, ale nie do odczytu. Podobnie dla katalogu.

Powyższa lista jest oczywiście niekompletna.

+0

Trzy z tych zdrowych rozsądków nie spowodują nieautoryzowanego wyjątku wyjątkowego. A pozostałe dwa są dokładnie tym, dlaczego metoda przełknęła wyjątek: chce tylko plików, do których ma dostęp. –

1

Zakładając, że komentarz w oryginalnym kodzie jest dokładny opis tego, co próbujesz zrobić, myślę, że chcesz napisać to tak:

foreach (FileInfo fi in di.GetFiles()) 
{ 
    //TODO: what exceptions should be handled here? 
    collection.Add(fi.Name); 
} 

// populate collection for each directory we have authorized access to 
foreach (DirectoryInfo d in di.GetDirectories()) 
{ 
    try 
    { 
     populateItems(collection, d); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     //ignore and move onto next directory 
    } 
} 

A potem trzeba pracować na tym TODO pozycja.

+0

Element TODO jest łatwy - prawie na pewno nie chcesz obsługiwać żadnych wyjątków. – Joe

+0

Prawdopodobnie masz rację. Ale nie zamierzam się domyślać, co oryginalny plakat zamierzał zrobić w kodzie, a w recenzji kodu kazałbym mu to powiedzieć. –

1

Zgadzam się z ludźmi, którzy twierdzą, że zignorowanie wyjątku to prawdopodobnie zły pomysł. Jeśli nie zamierzasz ponownie rzucać, to przynajmniej zaloguj się gdzieś. Napisałem małe narzędzia, które przetwarzają listę plików, w których nie chcę, aby błędy poszczególnych plików powodowały awarię całego programu, iw takich przypadkach wydrukowałbym komunikat ostrzegawczy, dzięki czemu mogłem zobaczyć, które pliki zostały pominięte.

Jedyny przypadek, w którym osobiście złapałem wyjątek bez nazywania go, tak jak w przypadku catch (xxxException), polega na tym, że zamierzam zareagować na nie w jakiś sposób, a następnie ponownie go wyrzucić, aby można było go złapać trochę zewnętrznej rutyny. Np .:

try 
{ 
    // do something 
    // ... 
} 
catch(UnauthorizedAccessException) 
{ 
    // react to this exception in some way 
    // ... 

    // let _someone_ know the exception happened 
    throw; 
}