2015-04-30 14 views
9

Temel olarak, özelleştirilmiş hata türümü tüm işlevlerimde kullanmak istiyorum ve varolan std hatalarını sarmak zorundayım, böylece tüm std yöntemlerinde try! makrosu başarılı olacaktır. İşte Tüm varolan Hatalar için bir hata sarıcı nasıl uygulanır

yapıyorum budur:

#![feature(optin_builtin_traits)] 
use std::error::Error; 
use std::fmt; 
use std::fs; 
#[derive(Debug)] 
enum MyError { 
    A, 
    B, 
} 

impl fmt::Display for MyError { 
    fn fmt(&self, _f: &mut fmt::Formatter) -> fmt::Result { 
     Ok(()) 
    } 
} 

impl Error for MyError { 
    fn description(&self) -> &str { 
     "" 
    } 
} 

trait NotMyError { } 
impl NotMyError for .. { } 
impl !NotMyError for MyError { } 

impl<T: NotMyError + Error> From<T> for MyError { 
    fn from(_: T) -> MyError { 
     MyError::A 
    } 
} 

fn test() -> Result<(), MyError> { 
    try!(fs::read_dir("test")); 
    Ok(()) 
} 

fn main() {} 

derleyici yakınır:

<std macros>:6:1: 6:32 error: the trait `NotMyError` is not implemented for the type `std::error::Error + Send + Sync` [E0277] 
<std macros>:6 $ crate:: convert:: From:: from (err)) } }) 
<std macros>:1:1: 6:48 note: in expansion of try! 

Herhangi bir yardım çok takdir edilmektedir.

+0

Bu bana bir hata gibi geliyor. Büyüklüğü olmayan türü 'std :: error :: Error + Send + Sync' (muhtemelen 'Error' uygulanmayan, böylelikle parçanın doğru olması gereken) '' in nereden geldiğini göremiyorum. 'uygulama, std :: io :: error :: Error' dir. 'std :: io :: error :: Error' * bir kutulu' Error + Send + Sync' içerir, ancak burada herhangi bir etkisi olmamalıdır. –

+0

Jon Reem bunu açıklamaya yardımcı oldu, bu yüzden bana açık: Bu olumsuz ifadeler, 'Gönder' ve 'Senk' gibi işaretleyici özelliklerine bağlanır ve bu nedenle, nesneler ile zayıf şekilde etkileşir; std :: error :: Error + Send' ise, 'std :: error :: Error 'türünde' Send 'komutunu uygulamıyor. Negatif uygulama yaklaşımını kullanmak, 'NotMyError' bağına sahip olmayan bir özellik nesnesi içeren herhangi bir şeyin (ör. 'Std :: error :: Error + Send + Sync + NotMyError')' NotMyError 'uygulamasını uygulamadığı anlamına gelir. Çok üzgünüm, size daha önce beslediğim bu yaklaşım, gerçekten işe yaramayacak gibi görünüyor. –

cevap

İlgili konular