Czy można przetestować, czy WebBrowser.Document został usunięty, aby nie otrzymywać wyjątków ObjectDisposedException?

Czy można przetestować, czy WebBrowser.Document został usunięty, aby nie otrzymywać wyjątków ObjectDisposedException?

Wiem, że poniższy kod wykona zadanie, ale wolałbym przetestować usuwanie dokumentu, zamiast go przechwycić. jakieś pomysły?

  private Size GetContentSize()
    {
        try
        {
            if (
                this.webBrowser.Document != null
                &&
                this.webBrowser.Document.Body != null)
            {
                return this.webBrowser.Document.Body.ScrollRectangle.Size;
            }
            else
            {
                return Size.Empty;
            }
        }
        catch (ObjectDisposedException)
        {
            return Size.Empty;
        }
    }      

person AidanO    schedule 08.11.2010    source źródło


Odpowiedzi (3)


Typ WebBrowser.Document to HtmlDocument. Nie ma metody Dispose().

Bardziej prawdopodobnym źródłem wyjątku jest sama przeglądarka internetowa. Ma właściwość IsDisposed, której można użyć. Jednak zdecydowanie zalecam, abyś poszukał błędu w kodzie zamiast stosować ten bandaid. Być może zabłąkane stwierdzenie używania.

person Hans Passant    schedule 08.11.2010
comment
Dzięki Hans, to się zgadza. Pomyślałem, że skoro mogę oglądać przeglądarkę i ponieważ niektóre wartości się wyświetlały, to nie można jej usunąć. Jak się okazuje, tak nie jest. - person AidanO; 08.11.2010
comment
Prawdą jest też, że lepszym rozwiązaniem byłoby na pewno dowiedzieć się, dlaczego jest on usuwany i lepiej sobie z tym poradzić, ale nie mogę tego zrobić w tej chwili. Dziękuję - person AidanO; 08.11.2010
comment
To trywialne, aby się dowiedzieć. Utwórz własną klasę pochodną WB i zastąp metodę Dispose(bool). Ustaw na nim punkt przerwania. - person Hans Passant; 08.11.2010

Zaczekaj chwilę. Fakt, że zadajesz pytanie, wskazuje na zasadniczą wadę Twojego projektu. Dlaczego trzymasz się obiektu, który prawdopodobnie już został usunięty? Na tym polega problem. Nie powinieneś potrzebować odpowiedzi na pytanie „skąd mam wiedzieć, czy został usunięty?” Jeśli masz odwołanie do obiektu, oznacza to, że nie zostało ono usunięte. Jeśli go pozbyłeś, powinieneś wyrzucić wszystkie odniesienia do niego.

I odwrotnie, jeśli ktoś inny ma odwołanie i nie wie, że go usunąłeś, to nie powinieneś go usuwać, kod, który nadal używa obiektu, ponosi odpowiedzialność za jego usunięcie.

Potrzebujesz kontraktu, który opisuje, kto jest właścicielem tego obiektu i kiedy go zlikwiduje, a następnie zaimplementuje tę umowę. Jeśli to zrobisz, będziesz wiedział, czy obiekt został usunięty, a wyjątek wskaże błąd będący naruszeniem umowy.

Oto artykuł, który napisałem jakiś czas temu na temat pokrewnego problemu:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/08/high-maintenance.aspx

person Eric Lippert    schedule 08.11.2010
comment
Dzięki Eric, dobre punkty. Zajmę się również refaktoryzacją kodu. - person AidanO; 08.11.2010

ObjectDisposedException jest generowany, gdy wystąpienie WebBrowser nie jest już prawidłowe. Tak więc sprawdzenie dokumentu nadal spowoduje zgłoszenie ObjectDisposedException, ponieważ instancja WebBrowser jest już usunięta... Tak czy inaczej, powinieneś mieć Catch w swoim kodzie, aby mieć pewność, że obiekt nie został usunięty między sprawdzeniem a powrotem...

person shin    schedule 08.11.2010