Który:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
LUB
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
źródło
źródło
}
zusing
oświadczeniem może rzucić wyjątek jako przypomnienia tutaj .finally
domyślną metodę zwaną dispose.Odpowiedzi:
Wolę drugi. Może również uwięzić błędy związane z tworzeniem obiektu.
źródło
try
bloku, co pozwala na wyświetlenie komunikatu o błędzie, jeśli coś się nie powiedzie, program ma teraz możliwość odzyskania i poinformowania użytkownika.using( DBConnection conn = DBFactory.getConnection())
która musiałaby zostać wycofana w przypadku wystąpienia wyjątku. Wydaje mi się, że oboje mają swoje miejsce.Ponieważ blok używający jest po prostu uproszczeniem składni try / wreszcie ( MSDN ), osobiście wybrałbym następujące, choć wątpię, aby znacznie różniło się od twojej drugiej opcji:
źródło
finally
bloku jest lepsze odusing
instrukcji?finally
bloku, który usuwa obiekt IDisposable, jest tym, cousing
robi instrukcja. Osobiście podoba mi się to zamiast osadzonegousing
bloku, ponieważ uważam, że bardziej czysto stwierdza, gdzie wszystko się dzieje i że wszystko jest na tym samym „poziomie”. Podoba mi się również więcej niż kilka osadzonychusing
bloków ... ale to wszystko po prostu moje preferencje.try
aby mógł zostać umieszczony wfinally
instrukcji; w przeciwnym razie, będzie rzucać błąd kompilatora: „Wykorzystanie nieprzydzielonej zmiennej lokalnej«myObject»”Cannot assign null to implicitly-typed local variable
;) Ale wiem, co masz na myśli i osobiście wolałbyś to niż zagnieżdżanie bloku używanego.To zależy. Jeśli korzystasz z Windows Communication Foundation (WCF),
using(...) { try... }
nie będzie działać poprawnie, jeśli serwer proxy wusing
instrukcji jest w stanie wyjątku, tzn. Usunięcie tego serwera proxy spowoduje kolejny wyjątek.Osobiście wierzę w minimalne podejście do obsługi, tj. Obsługuj tylko wyjątki, o których wiesz w momencie wykonania. Innymi słowy, jeśli wiesz, że inicjalizacja zmiennej
using
może wywołać określony wyjątek, to ją zawijamtry-catch
. Podobnie, jeśli wusing
ciele może się zdarzyć coś, co nie jest bezpośrednio związane ze zmienną wusing
, to zawijam to innymtry
dla tego wyjątku. Rzadko używamException
w swoimcatch
es.Ale mi się podoba
IDisposable
iusing
może dlatego jestem stronniczy.źródło
Jeśli instrukcja catch musi uzyskać dostęp do zmiennej zadeklarowanej w instrukcji using, wówczas wewnątrz jest twoją jedyną opcją.
Jeśli instrukcja catch potrzebuje obiektu, do którego istnieje odwołanie, zanim zostanie usunięta, wówczas wewnątrz jest twoją jedyną opcją.
Jeśli instrukcja catch podejmie działanie o nieznanym czasie trwania, np. Wyświetli komunikat dla użytkownika, a chcesz zutylizować swoje zasoby, zanim to nastąpi, wtedy najlepszym rozwiązaniem jest wyjście na zewnątrz.
Ilekroć mam scenerię podobną do tej, blok try-catch jest zwykle w innej metodzie w górę stosu wywołań niż za pomocą. Nie jest typowe dla tej metody, aby wiedzieć, jak obsługiwać wyjątki, które występują w niej w ten sposób.
Więc moja ogólna rekomendacja jest na zewnątrz - na zewnątrz.
źródło
Obie są poprawną składnią. To naprawdę sprowadza się do tego, co chcesz zrobić: jeśli chcesz wyłapać błędy związane z tworzeniem / usuwaniem obiektu, użyj drugiego. Jeśli nie, użyj pierwszego.
źródło
Przywołam tutaj jedną ważną rzecz: pierwsza nie złapie żadnego wyjątku wynikającego z wywołania
MyClass
konstruktora.źródło
Od C # 8.0 wolę używać tego samego w ten sam sposób
i wtedy
źródło
Jeśli obiekt, który inicjujesz w bloku Using (), może zgłosić wyjątek, powinieneś przejść do drugiej składni, w przeciwnym razie obie są równie poprawne.
W moim scenariuszu musiałem otworzyć plik i przekazałem filePath do konstruktora obiektu, który inicjowałem w bloku Using (), i może wygenerować wyjątek, jeśli filePath jest niepoprawny / pusty. W tym przypadku druga składnia ma sens.
Mój przykładowy kod: -
źródło
Od wersji C # 8.0 możesz uprościć
using
instrukcje pod pewnymi warunkami, aby pozbyć się zagnieżdżonego bloku, a następnie dotyczy to tylko otaczającego bloku.Twoje dwa przykłady można sprowadzić do:
I:
Oba są dość jasne; a następnie ogranicza to wybór między nimi do kwestii tego, jaki ma być zakres obiektu, gdzie chcesz obsługiwać błędy instancji i kiedy chcesz go pozbyć.
źródło