Arasındaki ilişki Failureve Exceptionbir olduğunu Failurebir sahiptir Exception- söylemek olduğunu, onun devletin parçası olarak istisna nesnesini tutar. Bunun gibi bir şey:
class Failure {
has Exception $.exception;
# ...
}
Bir Failure"patladığında" bunu Exceptioniçinde olanı fırlatarak yapar . Böylece, CATCHbloğa ulaşan şey Exceptionnesnedir ve çevreye geri bir bağlantı yoktur Failure. (Aslında, belirli bir Exceptionnesne prensipte birçok kişi tarafından tutulabilir Failure.)
Bu nedenle, bunu tespit etmenin doğrudan bir yolu yoktur. Tasarım açısından bakıldığında, muhtemelen olmamalı ve probleminizi çözmek için farklı bir yol bulmalısınız. A Failuresadece bir istisnanın atılmasını ertelemenin ve bir değer olarak muamele görmesine izin vermenin bir yoludur; altta yatan sorunun doğasının değişmesi amaçlanmamıştır, çünkü kontrol akışının derhal aktarılması yerine bir değer olarak iletilir. Ne yazık ki, asıl hedef soruda belirtilmedi; kontrol istisnalarına bakmak yararlı olabilir, ancak aksi takdirde çözmeye çalıştığınız temel sorun hakkında başka bir soru yayınlayabilirsiniz. Muhtemelen daha iyi bir yol var.
Bütünlüğü sağlamak için, orada dikkat edeceğiz olan biri olduğunu tespit edebileceğimiz anlamına dolaylı yolları Exceptionbir tarafından atıldı Failure. Örneğin .backtrace, istisna nesnesini alır ve üst çerçevenin paketine bakarsanız, nesnenin aşağıdakilerden geldiğini belirlemek mümkündür Failure:
sub foo() { fail X::AdHoc.new(message => "foo") }
try {
foo();
CATCH {
note do { no fatal; .backtrace[0].code.package ~~ Failure };
.resume
}
}
Ancak, bu büyük ölçüde kolayca değişebilecek uygulama ayrıntılarına bağlıdır, bu yüzden ona güvenmem.