Bir uygulamada eşzamanlı hataları işleme

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

En yaygın hata işleme, senkronize hata işleme mantığıdır, burada bir uygulama çalışırken senkronize hataları yakalamak için kodunuza deyimler eklersiniz. Bu hata işleme türü, işlevler başarısız olduğunda uygulamanızın çalışma zamanı hatalarını fark etmesine ve gidermesine olanak sağlar. Eşzamanlı hata yakalama mantığı, try..catch..finally deyimlerini içerir, bu ifadeler bir işlemi dener, Flash çalışma zamanından gelen herhangi bir hata yanıtını yakalar ve son olarak başarısız olan işlemi işlemek için başka bir işlemi çalıştırır.

try..catch..finally deyimlerini kullanma

Eşzamanlı çalışma zamanı hatalarıyla çalışırken, hataları yakalamak için try..catch..finally deyimlerini kullanın. Bir çalışma zamanı hatası oluştuğunda, Flash çalışma zamanı bir istisna atar, başka bir deyişle, normal çalıştırmayı askıya alır ve Error türü için özel bir nesne oluşturur. Daha sonra Error nesnesi kullanılabilir birinci catch bloğuna atılır.

try deyimi, hata oluşturma olasılığına sahip deyimleri kapsar. Her zaman try deyimiyle catch deyimini kullanırsınız. try ifade bloğundaki ifadelerden birinde hata algılanırsa o try ifadesine eklenen catch deyimleri çalıştırılır.

finally deyimi, try bloğunda bir hata oluşsa da oluşmasa da yürütülecek olan deyimleri kapsar. Herhangi bir hata yoksa, try blok deyimleri tamamlandıktan sonra finally bloğundaki deyimler çalıştırılır. Bir hata varsa, ilk olarak catch deyimi sonra da finally bloğundaki deyimler çalıştırılır.

Aşağıdaki kod, try..catch..finally deyimlerinin kullanılmasına yönelik sözdizimini gösterir:

try 
{ 
    // some code that could throw an error 
} 
catch (err:Error) 
{ 
    // code to react to the error 
} 
finally 
{ 
    // Code that runs whether an error was thrown. This code can clean 
    // up after the error, or take steps to keep the application running. 
}

Her catch deyimi, işlediği belirli bir istisna türünü tanımlar. catch deyimi yalnızca Error sınıfının alt sınıfları olan hata sınıflarını belirtebilir. Her catch deyimi sırayla denetlenir. Yalnızca fırlatılan hata türüyle eşleşen ilk catch ifadesi çalıştırılır. Başka bir deyişle, ilk olarak yüksek düzeydeki Error sınıfını ve sonra da Error sınıfının bir alt sınıfını denetlerseniz, yalnızca yüksek düzeydeki Error sınıfı eşleşir. Aşağıdaki kod bu noktayı gösterir:

try 
{ 
    throw new ArgumentError("I am an ArgumentError"); 
} 
catch (error:Error) 
{ 
    trace("<Error> " + error.message); 
} 
catch (error:ArgumentError) 
{ 
    trace("<ArgumentError> " + error.message); 
}

Önceki kod, şu çıktıyı görüntüler:

<Error> I am an ArgumentError

ArgumentError hatasını doğru şekilde yakalamak için, aşağıdaki kodun gösterdiği gibi, en özel hata türlerinin ilk sırada ve daha genel hata türlerinin daha aşağıda listelendiğinden emin olmanız gerekir:

try 
{ 
    throw new ArgumentError("I am an ArgumentError"); 
} 
catch (error:ArgumentError) 
{ 
    trace("<ArgumentError> " + error.message); 
} 
catch (error:Error) 
{ 
    trace("<Error> " + error.message); 
}

ActionScript API'sindeki birçok yöntem ve özellik, çalıştırılırken hatalarla karşılaşırsa çalışma zamanı hataları atar. Örneğin, aşağıdaki kodda gösterildiği gibi, yöntem ses akışını kapatamazsa, Sound sınıfındaki close() yöntemi bir IOError hatası atar:

var mySound:Sound = new Sound(); 
try 
{ 
    mySound.close(); 
} 
catch (error:IOError) 
{ 
    // Error #2029: This URLStream object does not have an open stream. 
}

Adobe Flash Platformu için ActionScript 3.0 Başvurusu 'nu öğrendikçe, her yöntemin açıklamasında ayrıntıyla anlatıldığı gibi hangi yöntemlerin istisna attığını fark edeceksiniz.

throw deyimi

Flash çalışma zamanları çalışan uygulamalarınızda hatalarla karşılaştığı zaman istisna atar. Ayrıca, throw deyimini kullanarak kendiniz de açıkça istisnalar atabilirsiniz. Adobe, açıkça hata atarken Error sınıfının veya bu sınıfın alt sınıflarının örneklerini atmanızı önerir. Aşağıdaki kod, Error sınıfının bir örneğini ( MyErr ) atan ve hata atıldıktan sonra yanıt vermek için bir işlev ( myFunction() ) çağıran throw deyimini gösterir:

var MyError:Error = new Error("Encountered an error with the numUsers value", 99); 
var numUsers:uint = 0; 
try 
{ 
    if (numUsers == 0) 
    { 
        trace("numUsers equals 0"); 
    } 
} 
catch (error:uint) 
{ 
    throw MyError; // Catch unsigned integer errors. 
} 
catch (error:int) 
{ 
    throw MyError; // Catch integer errors. 
} 
catch (error:Number) 
{ 
    throw MyError; // Catch number errors. 
} 
catch (error:*) 
{ 
    throw MyError; // Catch any other error. 
} 
finally  
{ 
    myFunction(); // Perform any necessary cleanup here. 
}

catch deyimlerinin, en belirli veri türleri ilk sırada olacak şekilde sıralandığına dikkat edin. Sayı veri türü için catch ifadesi ilk sırada listelenmiş olsaydı, uint veri türü için catch ifadesi çalıştırılamazdı.

Not: Java programlama dilinde, bir istisna atabilen her işlevin bu gerçeği bildirmesi ve atabildiği istisna sınıflarını işlev bildirimine eklenen bir throws deyiminde listelemesi gerekir. ActionScript bir işlev tarafından fırlatılan istisnaları belirtmenizi gerektirmez.

Basit bir hata mesajını görüntüleme

Yeni istisna ve hata olayı modelinin en büyük avantajlarından biri, kullanıcılara eylemin ne zaman ve neden başarısız olduğunu bildirmenize olanak sağlamasıdır. Sizin göreviniz, mesajı görüntülemek ve yanıt olarak seçenekler sunmak için kod yazmaktır.

Aşağıdaki kod, hatayı bir metin alanında görüntülemek için basit bir try..catch deyimini gösterir:

package 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 
     
    public class SimpleError extends Sprite 
    { 
        public var employee:XML =  
            <EmpCode> 
                <costCenter>1234</costCenter> 
                <costCenter>1-234</costCenter> 
            </EmpCode>; 
 
        public function SimpleError() 
        { 
            try 
            { 
                if (employee.costCenter.length() != 1) 
                { 
                    throw new Error("Error, employee must have exactly one cost center assigned."); 
                } 
            }  
            catch (error:Error) 
            { 
                var errorMessage:TextField = new TextField(); 
                errorMessage.autoSize = TextFieldAutoSize.LEFT; 
                errorMessage.textColor = 0xFF0000; 
                errorMessage.text = error.message; 
                addChild(errorMessage); 
            } 
        } 
    } 
}

ActionScript 3.0, daha çeşitli hata sınıflarını ve yerleşik derleyici hatalarını kullanarak, bir şeyin neden başarısız olduğuna dair önceki ActionScript sürümlerinden daha fazla bilgi sunar. Bu bilgi, iyi hata işleme özelliğine sahip daha kararlı uygulamalar oluşturmanıza olanak sağlar.

Hataları yeniden atma

Uygulama oluşturduğunuzda, hatayı düzgün şekilde işleyemezseniz hatayı yeniden fırlatmanızı gerektirecek birçok durum vardır. Örneğin, aşağıdaki kod yuvalanmış bir try..catch bloğunu gösterir, bu, yuvalanmış blok catch bloğu hatayı işleyemezse özel bir ApplicationError hatasını yeniden atar:

try 
{ 
    try 
    { 
        trace("<< try >>"); 
        throw new ApplicationError("some error which will be rethrown"); 
    } 
    catch (error:ApplicationError) 
    { 
        trace("<< catch >> " + error); 
        trace("<< throw >>"); 
        throw error; 
    } 
    catch (error:Error) 
    { 
        trace("<< Error >> " + error); 
    } 
} 
catch (error:ApplicationError) 
{ 
    trace("<< catch >> " + error); 
}

Önceki kod parçasındaki çıktı şöyle olur:

<< try >> 
<< catch >> ApplicationError: some error which will be rethrown 
<< throw >> 
<< catch >> ApplicationError: some error which will be rethrown

Yuvalanmış try bloğu, sonraki catch bloğu tarafından yakalanan özel bir ApplicationError hatası atar. Bu yuvalanmış catch bloğu, hatayı işlemeye çalışır ve başarısız olursa, ApplicationError nesnesini kapsayan try..catch bloğuna atar.