Arasındaki ilişki Failure
ve Exception
bir olduğunu Failure
bir 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 Exception
içinde olanı fırlatarak yapar . Böylece, CATCH
bloğa ulaşan şey Exception
nesnedir ve çevreye geri bir bağlantı yoktur Failure
. (Aslında, belirli bir Exception
nesne 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 Failure
sadece 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ı Exception
bir 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.