Dnes malá perlička z microsoftího světa. Nejprve o zlomyslných programátorech. Dostala se mi do ruky knihovna (DLL) pro .NET. Při použití v programu napsaném v C# vyhodila výjimku. RuntimeWrappedException. Dobrá tedy, někdo použil throw na objekt nedědící z Exception. Vezmu WrappedException, jenže tu nelze přetypovat, protože nějaký dobrák použil šablonu, takže C# onu třídu vůbec nevidí (nenašeptává, nepřekládá). Kontrolní otázka: pokud vím, že vyhozená třída má metodu UserData, jak ji zavolám?
A ještě pokračování. Při použití zmíněné knihovny v C++/CLI napíšu stejný kód, použiju „catch (Exception^ e)…“ a ejhle, výjimka se nezachytila. RuntimeWrappedException dědí z Exception, takže soudruzi z Microsoftu někde udělali chybu. Když nahradím Exception typem Object, najednou se zachytí. A e je typu RuntimeWrappedException. Nevím, co v Redmondu berou, ale chci to taky.
"pokud vím, že vyhozená třída má metodu UserData, jak ji zavolám"
buď přes reflexi: něco.GetType().GetMethod("UserData").Invoke(něco, params)
kde něco je instance, prams je pole parametrů. Samozřejmě každá z těchto metod může házet výjimky nebo vracet null, je třeba na to myslet.
anebo přes typ dynamic.
Jinak některé metody z Win32 api mají ve zvyku házet výjimky "Operation completed successfully". Sice to není odpověď na otázku "co v Redmondu berou", ale zcela určitě je to něco hoooodně nelegálního :-)
Error: No error. To se mi stava casto :-) Zrovna predevcirem. Holt nektera funkce vratila error, tak zavolam par funkci na vraceni se do definovaneho stavu, return error, ale errno se mezitim vycistilo, takze aplikace vyhlasila hlasku zminenou nahore. To je z toho, ze flag erroroveho stavu se vraci returnem, ale pro zjednoduseni programu se pak kod erroru bere z globalni promenne. Ale program je krasne citelny:
if ( nejaka_funkce() ) { showError(); return; }
Dodal bych, že to, že to nezachytí catch (Exception^ e), není chyba, protože CLR všechny takové výjimky obalí RuntimeWrappedException, ale při zachytávání je zase rozbalí, takže očekávané chování je chytit Object (ale ne typu RuntimeWrappedException). Zkusil jsem to ve VS2012 a nepřišel jsem na příklad, kde by to tak nebylo. Pokud nastavíte WrapNonExceptionThrows na true, pak se to chová jako v C# (tam to asi nastaví překladač), tj. chytíte to v catch (Exception^ e) a je to RuntimeWrappedException.
(Aspoň podle http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimecompatibilityattribute%28v=vs.110%29.aspx )
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 203×
Přečteno 25 362×
Přečteno 23 796×
Přečteno 20 178×
Přečteno 17 875×