Nie jestem programistą systemu Windows, ale wydaje mi się, że za pomocą strukturalną obsługę wyjątków traktować wyjątki sprzętowe jak wyjątkami oprogramowania oznacza, że:
- Twój kod robi coś, co w C ++ standardowy produkuje niezdefiniowany lub wykonania zdefiniowane zachowanie (takie jak dzielenie przez zero).
- Okna określa, że z włączonym SEH zgłasza wyjątek w tej sprawie.
- Używasz tego faktu do połowu wyjątek i / lub wykonanie obsługi terminacji.
Tak więc pytania zadać, IMO, są następujące:
- Twoim zadaniem jest programowanie naprawdę charakter, że standard C ++ nie może obsłużyć? (Lub może obsłużyć tylko w sposób, który jest wymiernie gorsze od tego, co można uzyskać poprzez umożliwienie wyjątek sprzętowy).
- Czy naprawdę trzeba podjąć działania, kiedy Twój kod idzie niestandardowe?
- Można napisać kod tak, aby nie prowokować wyjątków sprzętowych w pierwszej kolejności?
W przypadku udzielenia odpowiedzi „tak”, „tak”, „nie”, potrzebne jest następnie strukturze obsługi wyjątków. W przeciwnym razie może być w stanie go uniknąć, w tym przypadku prawdopodobnie chcesz. Pisanie kodu wyjątku bezpieczny jest trudne, więc tym silniejsze wyjątek gwarantuje można zaoferować lepsze. Kod, który może dzieli przez zero z SEH nie oferuje gwarancji nothrow, kiedy być może z odrobiną przeprojektowanie tak, że dzwoniący nie dają mu dane Duff, może to zrobić. Ale jeśli funkcja ma już rzucać wyjątki dla innych powodów, wtedy też prawdopodobnie wyrzucanie ich do pułapek sprzętowych może dokonać rzeczy nie gorzej.
Jedną z istotnych Szczególnym przypadkiem jest alokacja pamięci. Nie wiem, czy .NET to robi, ale na przydział linux nie tylko jeśli jest niewystarczająca wirtualnej przestrzeni adresowej dla alokacji. Pamięć fizyczna jest zobowiązana przy pierwszym użyciu i powoduje wyjątek sprzętową jeśli nie ma wystarczająco dużo. Ponieważ przydział pamięci powinien rzucać std :: bad_alloc na niepowodzenie, a realizacja nie trafia do realizacji tego wymogu standardu, to możemożliwe, że w niektórych przypadkach konwersji wyjątek sprzętu do oprogramowania jest dobrą rzeczą do zrobienia. Jednak wyjątek ten sprzęt może pojawić się w nieoczekiwanych miejscach, (w tym procedur Ci się, że były nothrow), więc może być nadal niemożliwe obsłużyć wdziękiem, dlatego rdzeń linux wysypisk zamiast rzucania. W praktyce wszystko, co dostaje zainicjowanego całkowicie padnie jej konstruktora, który jest często na tyle blisko, że wyjątek alokacji oprogramowanie zamiast byłaby przydatna.