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  }