Aracılığıyla paylaş


Özel Durumlar (C++/CX)

C++/CX'te hata işleme özel durumları temel alır. En temel düzeyde, Windows Çalışma Zamanı bileşenler hataları HRESULT değerleri olarak bildirir. C++/CX'te, bu değerler bir HRESULT değeri ve program aracılığıyla erişebileceğiniz bir dize açıklaması içeren kesin olarak belirlenmiş özel durumlara dönüştürülür. Özel durumlar, 'den Platform::Exceptiontüretilen bir ref class olarak uygulanır. Ad alanı, Platform en yaygın HRESULT değerleri için ayrı özel durum sınıfları tanımlar; diğer tüm değerler sınıfı aracılığıyla Platform::COMException bildirilir. Tüm özel durum sınıflarının özgün HRESULT değerini almak için kullanabileceğiniz bir Exception::HResult alanı vardır. Ayrıca, C++ dışında bir dilde yazılmış koddan kaynaklanmış olsa bile özel durumun özgün kaynağını saptamaya yardımcı olabilecek hata ayıklayıcıda kullanıcı kodu için çağrı yığını bilgilerini inceleyebilirsiniz.

Özel durumlar

C++ programınızda, bir Windows Çalışma Zamanı işleminden, türünden türetilen std::exceptionbir özel durumdan veya kullanıcı tanımlı bir türden gelen bir özel durum oluşturup yakalayabilirsiniz. Yalnızca uygulama ikili arabirimi (ABI) sınırını aşacaksa, örneğin özel durumunuzu yakalayan kod JavaScript'te yazıldığında Windows Çalışma Zamanı özel durum oluşturmanız gerekir. Windows Çalışma Zamanı olmayan bir C++ özel durumu ABI sınırına ulaştığında, özel durum E_FAIL Platform::FailureException HRESULT'u temsil eden bir özel duruma çevrilir. ABI hakkında daha fazla bilgi için bkz. C++'da Windows Çalışma Zamanı Bileşenleri Oluşturma.

BIR HRESULT parametresini veya HRESULT parametresini alan iki oluşturucudan birini ve ABI üzerinden bunu işleyen herhangi bir Windows Çalışma Zamanı uygulamasına geçirilebilen bir Platform::String^ parametresini kullanarak Platform::Exception bildirebilirsiniz. Öte yandan iki Exception::CreateException yöntemi aşırı yüklemelerinden birini kullanarak hresult parametresi veya HRESULT parametresi ve Platform::String^ parametre kullanarak bir özel durum bildirebilirsiniz.

Standart özel durumlar

C++/CX, tipik HRESULT hatalarını temsil eden bir dizi standart özel durumu destekler. Her standart özel durum Platform::COMException'dan türetilir ve bu da 'den Platform::Exceptiontüretilir. ABI sınırı boyunca bir özel durum oluşturduğunuzda, standart özel durumlardan birini oluşturmanız gerekir.

kendi özel durum türünüzü'den Platform::Exceptiontüretemezsiniz. Özel bir özel durum oluşturmak için kullanıcı tanımlı HRESULT kullanarak bir COMException nesne oluşturma.

Aşağıdaki tabloda standart özel durumlar listelemektedir.

Veri Akışı Adı Temel ALıNAN HRESULT Açıklama
COMException kullanıcı tanımlı hresult COM yöntem çağrısından tanınmayan bir HRESULT döndürildiğinde oluşturulur.
AccessDeniedException E_ACCESSDENIED Bir kaynağa veya özelliğe erişim reddedildiğinde oluşturulur.
ChangedStateException E_CHANGED_STATE Bir koleksiyon yineleyicisi veya koleksiyon görünümü yöntemleri üst koleksiyon değiştikten sonra çağrıldığında oluşturulur ve böylece yöntemin sonuçları geçersiz kılınir.
ClassNotRegisteredException REGDB_E_CLASSNOTREG BIR COM sınıfı kaydedilmediğinde oluşturulur.
DisconnectedException RPC_E_DISCONNECTED Bir nesnenin istemcilerinin bağlantısı kesildiğinde oluşturulur.
FailureException E_FAIL İşlem başarısız olduğunda oluşturulur.
InvalidArgumentException E_INVALIDARG Bir yönteme sağlanan bağımsız değişkenlerden biri geçerli olmadığında oluşturulur.
InvalidCastException E_NOINTERFACE Bir tür başka bir türe atanamazsa oluşturulur.
NotImplementedException E_NOTIMPL Bir arabirim yöntemi bir sınıfta uygulanmadıysa oluşturulur.
NullReferenceException E_POINTER Null nesne başvurusuna başvuruyu kaldırma girişimi olduğunda oluşturulur.
ObjectDisposedException RO_E_CLOSED Atılan nesnede bir işlem gerçekleştirildiğinde oluşturulur.
OperationCanceledException E_ABORT İşlem durdurulduğunda oluşturulur.
OutOfBoundsException E_BOUNDS Bir işlem geçerli aralığın dışındaki verilere erişmeye çalıştığında oluşturulur.
OutOfMemoryException E_OUTOFMEMORY İşlemi tamamlamak için yeterli bellek olmadığında oluşturulur.
WrongThreadException RPC_E_WRONG_THREAD Bir iş parçacığı, iş parçacığının dairesine ait olmayan bir ara sunucu nesnesine yönelik arabirim işaretçisi aracılığıyla çağırdığında oluşturulur.

HResult ve İleti özellikleri

Tüm özel durumların HResult özelliği ve message özelliği vardır. Exception::HResult özelliği, özel durumun temel alınan sayısal HRESULT değerini alır. Exception ::Message özelliği, özel durumu açıklayan sistem tarafından sağlanan dizeyi alır. Windows 8'de ileti yalnızca hata ayıklayıcıda kullanılabilir ve salt okunurdur. Bu, özel durumu yeniden oluştururken değiştiremeyeceğiniz anlamına gelir. Windows 8.1'de, özel durumu yeniden oluşturursanız ileti dizesine program aracılığıyla erişebilir ve yeni bir ileti sağlayabilirsiniz. Zaman uyumsuz yöntem çağrıları için çağrı yığınları da dahil olmak üzere daha iyi çağrı yığını bilgileri hata ayıklayıcıda da kullanılabilir.

Örnekler

Bu örnekte zaman uyumlu işlemler için Windows Çalışma Zamanı özel durum oluşturma işlemi gösterilmektedir:

String^ Class1::MyMethod(String^ argument)
{
    
    if (argument->Length() == 0) 
    { 
        auto e = ref new Exception(-1, "I'm Zork bringing you this message from across the ABI.");
        //throw ref new InvalidArgumentException();
        throw e;
    }
    
    return MyMethodInternal(argument);
}

Sonraki örnekte özel durumun nasıl yakalanacakları gösterilmektedir.

void Class2::ProcessString(String^ input)
{
    String^ result = nullptr;    
    auto obj = ref new Class1();

    try 
    {
        result = obj->MyMethod(input);
    }

    catch (/*InvalidArgument*/Exception^ e)
    {
        // Handle the exception in a way that's appropriate 
        // for your particular scenario. Assume
        // here that this string enables graceful
        // recover-and-continue. Why not?
        result = ref new String(L"forty two");
        
        // You can use Exception data for logging purposes.
        Windows::Globalization::Calendar calendar;
        LogMyErrors(calendar.GetDateTime(), e->HResult, e->Message);
    }

    // Execution continues here in both cases.
    //#include <string>
    std::wstring ws(result->Data());
    //...
}

Zaman uyumsuz bir işlem sırasında oluşturulan özel durumları yakalamak için görev sınıfını kullanın ve hata işleme devamlılığı ekleyin. Hata işleme devamlılığı, diğer iş parçacıklarında oluşan özel durumları çağıran iş parçacığına doğru sıralar, böylece kodunuzda yalnızca bir noktada tüm olası özel durumları işleyebilirsiniz. Daha fazla bilgi için bkz . C++ dilinde Zaman Uyumsuz Programlama.

UnhandledErrorDetected olayı

Windows 8.1'de, işlemi daraltmak üzere olan işlenmeyen hatalara erişim sağlayan Windows::ApplicationModel::Core::CoreApplication::UnhandledErrorDetected statik olayına abone olabilirsiniz. Hatanın kaynağı ne olursa olsun, bu işleyiciye olay args ile geçirilen bir Windows::ApplicationModel::Core::UnhandledError nesnesi olarak ulaşır. nesneyi çağırdığınızda Propagate , hata koduna karşılık gelen türden bir Platform::*Exception oluşturur ve oluşturur. Catch bloklarında, gerekirse kullanıcı durumunu kaydedebilir ve ardından çağrısı throwyaparak işlemin sonlandırılmasına izin verebilir veya programı bilinen bir duruma geri döndürmek için bir şey yapabilirsiniz. Aşağıdaki örnekte temel desen gösterilmektedir:

app.xaml.h dosyasında:

void OnUnhandledException(Platform::Object^ sender, Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs^ e);

app.xaml.cpp:

// Subscribe to the event, for example in the app class constructor:
Windows::ApplicationModel::Core::CoreApplication::UnhandledErrorDetected += ref new EventHandler<UnhandledErrorDetectedEventArgs^>(this, &App::OnUnhandledException);

// Event handler implementation:
void App::OnUnhandledException(Platform::Object^ sender, Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs^ e)
{
    auto err = e->UnhandledError;

    if (!err->Handled) //Propagate has not been called on it yet.
{
    try
    {
        err->Propagate();
    }
    // Catch any specific exception types if you know how to handle them
    catch (AccessDeniedException^ ex)
    {
        // TODO: Log error and either take action to recover
        // or else re-throw exception to continue fail-fast
    }
}

Açıklamalar

C++/CX yan tümcesini finally kullanmaz.

Ayrıca bkz.

C++/CX Dil Başvurusu
Ad Alanları Başvurusu