dubbo.apache.org/dubbo-go/v3@v3.1.1/proxy/proxy_factory/utils.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package proxy_factory 19 20 import ( 21 "fmt" 22 "reflect" 23 ) 24 25 import ( 26 perrors "github.com/pkg/errors" 27 ) 28 29 // CallLocalMethod is used to handle invoke exception in user func. 30 func callLocalMethod(method reflect.Method, in []reflect.Value) ([]reflect.Value, error) { 31 var ( 32 returnValues []reflect.Value 33 retErr error 34 ) 35 36 func() { 37 defer func() { 38 if e := recover(); e != nil { 39 if err, ok := e.(error); ok { 40 retErr = err 41 } else if err, ok := e.(string); ok { 42 retErr = perrors.New(err) 43 } else { 44 retErr = fmt.Errorf("invoke function error, unknow exception: %+v", e) 45 } 46 } 47 }() 48 49 returnValues = method.Func.Call(in) 50 }() 51 52 if retErr != nil { 53 return nil, retErr 54 } 55 56 return returnValues, retErr 57 }