मेरे सी # कोड पी के माध्यम से Win32 कार्यों को फोन करके प्रतिरूपण का उपयोग करता है/आह्वानप्रतिरूपित कोड से अपवाद क्यों नहीं पकड़ा गया है?
internal class Win32Native
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int ImpersonateLoggedOnUser(IntPtr token);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int RevertToSelf();
}
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
throw new Exception(); // this is for simulation
Win32Native.RevertToSelf()
} catch(Exception e) {
LogException(e);
throw;
}
भी मैं AppDomain.CurrentDomain.UnhandledException
हैंडलर स्थापित है कि यह भी सभी बिना क्रिया का अपवाद लॉग की है।
मुझे यकीन है कि अपवाद लॉग इन करने वाला कोड प्रतिरूपण के साथ और बिना दोनों ठीक काम करता है।
अब समस्या यह है कि उपरोक्त कोड में यह catch
दर्ज नहीं किया गया है और UnhandledException
भी नहीं कहा जाता है। अपवाद का एकमात्र निशान इवेंट व्यूअर में एक प्रविष्टि है।
अगर मैं एक finally
इस तरह जोड़ें:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
तो अपवाद दोनों catch
से और UnhandledException
हैंडलर से ठीक लॉग होता है।
क्या हो रहा है? क्या थ्रेड का प्रतिरूपण सामान्य अपवाद हैंडलिंग को रोकता है?
यदि आप 'LogException' पर ब्रेक-पॉइंट डालते हैं: क्या आप वहां जाते हैं? –
@MarcGravell: मुझे नहीं पता, वहां कोई डीबगर नहीं है जहां इसे पुन: उत्पन्न किया जाता है। मुझे एहसास है कि 'LogException()' के साथ कुछ समस्या हो सकती है, लेकिन अब तक जिस कोड पर निर्भर करता है वह दोनों प्रतिरूपित और प्रतिरूपित नहीं है। – sharptooth
यहां अनुमान लगाते हुए: चूंकि .NET निष्पादन संदर्भ का ट्रैक रखता है, इसलिए अपवाद हैंडलिंग का एहसास हो सकता है कि संदर्भ बदल गया है और अपवाद हैंडलर को तब तक निष्पादित करने से रोक रहा है जब तक कि वापस पहले निष्पादित नहीं किया जाता है। अगर ऐसा नहीं किया जाता है तो कोड को प्रतिरूपित उपयोगकर्ता के साथ चलाने के लिए विशेषाधिकारों की उन्नति होगी ... –