2015-12-04 1 views
2

У меня есть бережливости интерфейса сервиса для result следующего способа:Как реализовать услугу golang на основе Apache Thrift с исключениями?

exception SomeException { 
    1: string message; 
} 

string result(
    1: string token, 
    2: string identifier 
) throws (
    1: SomeException ex, 
); 

Как ди я реализую это правильно в golang? Я хочу, чтобы исключения были выбраны для клиентов этой услуги Thrift.

ответ

2

Здесь вступает Apache Thrift tutorial for Go. Учебник состоит из small service:

enum Operation { 
    ADD = 1, 
    SUBTRACT = 2, 
    MULTIPLY = 3, 
    DIVIDE = 4 
} 

struct Work { 
    1: i32 num1 = 0, 
    2: i32 num2, 
    3: Operation op, 
    4: optional string comment, 
} 

service Calculator extends shared.SharedService { 
    i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch), 

    // some other methods ... 
} 

Если клиент проходит операцию расчета на сервер таким образом:

work := tutorial.NewWork() 
work.Op = tutorial.Operation_DIVIDE 
work.Num1 = 1 
work.Num2 = 0 
quotient, err := client.Calculate(1, work) 
if err != nil { 
    switch v := err.(type) { 
    case *tutorial.InvalidOperation: 
     fmt.Println("Invalid operation:", v) 
    default: 
     fmt.Println("Error during operation:", err) 
    } 
    return err 
} else { 
    fmt.Println("Whoa we can divide by 0 with new value:", quotient) 
} 

сервер должен бросить исключение, как показано ниже. Нечто подобное происходит, когда какое-то неизвестное значение для w.Op передается:

func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32, err error) { 

switch w.Op { 
    case tutorial.Operation_DIVIDE: 
     if w.Num2 == 0 { 
      ouch := tutorial.NewInvalidOperation() 
      ouch.WhatOp = int32(w.Op) 
      ouch.Why = "Cannot divide by 0" 
      err = ouch 
      return 
     } 
     val = w.Num1/w.Num2 
     break 

    // other cases omitted 

    default: 
     ouch := tutorial.NewInvalidOperation() 
     ouch.WhatOp = int32(w.Op) 
     ouch.Why = "Unknown operation" 
     err = ouch 
     return 
    } 

    // more stuff omitted 
} 
0

Короткий ответ, что Бережливость Интерфейсы реализации (функции Error() string) errorinterface. Таким образом, может быть возвращен точно так же, как любой go error, как правило, return nil, err.

 Смежные вопросы

  • Нет связанных вопросов^_^