如何将一种异常作为参数传递?

时间:2015-05-03 19:44:34

标签: c#

我想有一个接收一种异常的方法(即传递的参数必须是一个实现System.Exception的类)。

这样做的正确方法是什么?

以下不是我想要的:

- (void)viewDidLoad {
    [super viewDidLoad];

    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
    webView.navigationDelegate = self;
    webView.scrollView.scrollEnabled = NO;
    [self.view addSubview:webView];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.de"]]];
    });
}

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    webView.scrollView.scrollEnabled = (webView.URL != nil);
}

...需要一个例外实例。我想传递一种类型的异常,例如public void SetException(Exception e)

编辑:为了进一步说明我想要做什么,我希望能够跟踪我之前看过每种类型的异常的次数。所以我希望能够做到这样的事情:

InvalidProgramException

我不想传递异常的实例,而是按异常类型跟踪它。

5 个答案:

答案 0 :(得分:2)

听起来你需要一个通用的方法

public void SetException<TException>() where TException : Exception
{
    ExceptionCounts[typeof(TException)]++;
}

您可以将其称为

SetException<InvalidProgramException>();

编辑:

Dictionary<Type, int> ExceptionCounts;
public void ExceptionSeen(Type type)
{
    ExceptionCounts[type]++;
}

将其命名为

ExceptionSeen(typeof(MyException));

或者如果您已经有异常实例

ExceptionSeen(ex.GetType());

答案 1 :(得分:1)

如果您只想传递一个类型,请指定'Type'作为参数类型,然后如果您想确保它是异常类型,您需要在运行时检查类型:

public void SetException(Type t) {
    if (!typeof(Exception).IsAssignableFrom(t)) {
       throw new ArgumentException("t");
    }
}

答案 2 :(得分:1)

定义一个获取实例的泛型方法,然后使用泛型类型约束强制它继承Exception

public void SetException<T>() where T : Exception
{
}

答案 3 :(得分:0)

像这样:

!

另一种选择是使用泛型来帮助

public void SetException(Type type)

SetException(typeof(InvalidProgramException))
// or
SetException(e.GetType)

public void SetException<T>()    
SetException<InvalidProgramException>()

答案 4 :(得分:-1)

您可以创建继承基本异常(即异常类)的自定义类,然后您可以通过已创建的自定义类的参数类型在方法中传递任何类型的异常。