2016-03-23 24 views
-2
İşte

akım yöntemdir:Perl ile yazılan bir karma kabul edebilmesi için bir hata dizesini döndüren bir yöntem değiştirmeye çalışıyorum

sub new { 
    my ($package, $message) = (shift, shift); 
    my %params = @_; 
    return bless { message => $message, %params }, $package; 
} 

Bu yöntem temelde bir hata dize döndürür ama değiştirmek istediğiniz Bu yüzden yeni hata yapmamı alıp dizeyi hata karmasından geri gönderebilir. Kafamı nasıl koruyacağımı anlayamıyorum. % param çalışma zamanı parametresini kabul eder ancak şimdilik göz ardı edilebilir. İşte

hata yapısı şöyledir: Sadece, yetersiz kalan denemesi başlatmak için bazı kodlar aşağı atmaya başladı

# this constant is an example of an error library (just included 1 error for example) 
    use constant { 

     CABLING_ERROR => { 
     errorCode => 561, 
     message => "Cabling incorrect to device in server A4r, contact DCT ", 
     tt => { template => 'cable'}, 
     fatal => 1, 
     link =>'http://www.error-fix.com/cabling 
     }, 
}; 

ama yeni() yöntemini değiştirerek nasıl başladığını şudur:

sub new { 
    my ($package, $message) = (shift, shift); 
    # defining new error hash 
    my $hash($errorCode, $message, $tt, $fatal, $link) = (shift, shift, shift, shift); 
    my %params = @_; 

    if(exists $hash->{errorCode}) { 
    return bless { errorCode => $errorCode, message => $message, tt => $tt, fatal => $fatal, link => $link}, %params; 
} 
    else { 
     return bless { message => $message, %params }, $package; 
} 
} 

Benim nimet anlayışım, onun hash refs nesnesini kılan olmasıdır. Hatalar sabit listede tutulur. İşte infaz edilmesi için ne kadar bir örnektir:

if(!device_model) { 
    die ARC::Builder::Error->new(CABLING_ERROR); 

} 

GÜNCELLEME: Ben birimine çalışıyorlar çözüm @simbabque sınamak ama bunun yerine hata mesajının bir dönüş değeri olarak boş bir dize almaya devam dize. Belki de benim testim doğru kurulmamış mı?

my $error = CABLING_ERROR; 

my $exp_out_A = ($error->{message}); 

my $error_in = new($error); 

diag($error_in); 

is($error_in, $exp_out_A, 'Correct message output'); 
+0

Neden sabitiniz var? Lütfen sorunuz [değiştir] ve giriş ve çıkış ile yapıcı için örnek bir çağrı ekleyin. - Aslında, "korusun" un ne yaptığını biliyor musun? Bu böyle gelmiyor. Lütfen bunun ne yapacağını ve hangi bağlamda olduğunu biraz daha açıklamaya çalışın. Bir X/Y problemi kokusu alıyorum. ;) – simbabque

+0

@simbabque iyi puanlar veriyor. Ben sadece şunu söyleyeyim * eğer * sabit bir karma tanımlamanız gerekiyorsa, 'Const :: Fast' gibi bir modül kullanmalısınız. Yukarıda tanımlanan "CABLING_ERROR" alanları değiştirilebilir. Ayrıca, başkalarının kolayca çalıştırabilirsiniz posta kodu. Sorunuzun odağı olmadıkça, kodunuz *** * sözdizimi hatası * içermemelidir *. –

+0

[Exception :: Class] (https://metacpan.org/pod/Exception::Class) veya [Throwable :: Error] (https://metacpan.org/pod/Throwable::Error) kullanmaktan daha iyidir.) –

cevap

2

Ne gerçekten istediğiniz bir mesaj dize ile adlandırılan veya ileti dizisini içeren, bilinen bir formun bir karma ile eğer ayırt etmek için yapıcı geçerli: Aşağıda benim yarattığım testin bir örnektir. Temel olarak, coerce mesaj özniteliğini kullanmak istiyorsunuz.

sub new { 
    my ($package, $thing) = (shift, shift); 
    my %params = @_; 

    if (ref $thing eq 'HASH') { 
    return bless { message => $thing->{message}, %params }, $package; 
    } 

    return bless { message => $thing, %params }, $package; 
} 

İşte bu kadar. Aldığınız paramın ref numarasını kontrol edin. Hash referansı ise 'HASH' olacaktır. Basit bir dize ise, undef olacaktır.

Karma referansınızdan otomatik olarak daha fazla %params oluşturmak istiyorsanız, bunun gibi bir şey görünür.

return bless { message => $thing->{message}, foo => $thing->{foo}, %params }, $package; 
İlgili konular