Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. use std::io;
  2. use std::fmt::Display;
  3. use std::fmt::Formatter;
  4.  
  5. // オレオレエラー列挙体
  6. #[derive(Debug)]
  7. enum myError{
  8. RustError(io::Error),
  9. FileError(myFileError),
  10. SocketError(mySocketError)
  11. }
  12.  
  13. // オレオレエラーコード定義その1(FFIでC言語から上がってくるint型のエラーとか)
  14. #[derive(Debug)]
  15. enum mySocketError{
  16. WriteError,ReadError
  17. }
  18.  
  19. // オレオレエラーコード定義その2(FFIでC言語から上がってくるint型のエラーとか)
  20. #[derive(Debug)]
  21. enum myFileError{
  22. ReadError,WriteError
  23. }
  24.  
  25. // オレオレエラー時に出力するメッセージを定義
  26. // どんなエラーかは書かずに、
  27. impl Display for myError{
  28. fn fmt(&self, f: &mut Formatter) -> std::fmt::Result{
  29. match *self {
  30. myError::RustError(ref e)=> print!("Rust {}",e),
  31. myError::FileError(ref e) => print!("File {}",e),
  32. myError::SocketError(ref e)=>print!("Socket {}",e)
  33. }
  34. Ok(())
  35. }
  36. }
  37. // Rustが持っているエラーをmyErrorへ変換する処理
  38. impl std::convert::From<io::Error> for myError{
  39. fn from(e: io::Error) -> Self {
  40. myError::RustError(e)
  41. }
  42. }
  43. // -----------------------------------
  44. // 独自エラーその1についての処理
  45. // メッセージ表示処理
  46. impl Display for myFileError{
  47. fn fmt(&self, f: &mut Formatter) -> std::fmt::Result{
  48. match *self {
  49. myFileError::ReadError => print!("read error"),
  50. myFileError::WriteError => print!("write error"),
  51. }
  52. Ok(())
  53. }
  54. }
  55. // myErrorへ変換する処理
  56. impl std::convert::From<myFileError> for myError{
  57. fn from(e: myFileError) -> Self {
  58. myError::FileError(e)
  59. }
  60. }
  61. // -----------------------------------
  62. // 独自エラーその2についての処理
  63. // メッセージ表示処理
  64. impl Display for mySocketError{
  65. fn fmt(&self, f: &mut Formatter) -> std::fmt::Result{
  66. match *self {
  67. mySocketError::ReadError => print!("read error"),
  68. mySocketError::WriteError => print!("write error"),
  69. }
  70. Ok(())
  71. }
  72. }
  73. // myErrorへ変換する処理
  74. impl std::convert::From<mySocketError> for myError{
  75. fn from(e: mySocketError) -> Self {
  76. myError::SocketError(e)
  77. }
  78. }
  79. // エラーの定義・変換処理はここまで
  80. // ------------------------------------
  81.  
  82.  
  83.  
  84. // orig_XXX_e は独自エラーを返却する関数
  85. fn orig_file_e()->Result<(),myFileError>{
  86. Err(myFileError::ReadError)
  87. }
  88.  
  89. fn orig_sock_e()->Result<(),mySocketError>{
  90. Err(mySocketError::WriteError)
  91. }
  92.  
  93. // Rustで定義されているエラーを返却する関数
  94. fn rust_e()->Result<(),io::Error>{
  95. Err(io::Error::last_os_error())
  96. }
  97.  
  98. // 独自エラーとRustが標準で持っているエラーを返却する関数を引数に応じて呼ぶ
  99. fn f(r:u32)->Result<(),myError>{
  100. match r{
  101. 0=> orig_file_e()?,
  102. 1=> orig_sock_e()?,
  103. _=> rust_e()?
  104. }
  105. Ok(())
  106. }
  107.  
  108. // 各処理を呼んで見る
  109.  
  110. // File read error
  111. // Socket write error
  112. // Rust この操作を正しく終了しました。 (os error 0)
  113. //
  114. // ↑みたいに表示される
  115. fn main() {
  116. for i in 0..3{
  117. match f(i){
  118. Ok(_)=>{},
  119. Err(e)=>println!("error : {}",e)
  120. }
  121. }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement