Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用()尝试捕获_C# - Fatal编程技术网

C# 使用()尝试捕获

C# 使用()尝试捕获,c#,C#,我的代码目前是 using(var driver = new driver()){something} 我希望能够捕获异常。但是,我只想捕获“driver=newdriver”引发的异常。通过在线查看,我可以找到如何捕获整个事件或“某物”引发的异常,但我无法确定如何将try捕获放入“using”参数中 就这么做吧: Driver driver = null; try { driver = new Driver(); } catch() { // do whatever, th

我的代码目前是

using(var driver = new driver()){something}
我希望能够捕获异常。但是,我只想捕获“driver=newdriver”引发的异常。通过在线查看,我可以找到如何捕获整个事件或“某物”引发的异常,但我无法确定如何将try捕获放入“using”参数中

就这么做吧:

Driver driver = null;

try
{
    driver = new Driver();
}
catch()
{
    // do whatever, throw, fail, return...
}

// if you did not break out of your logic in the catch (why not?)
// add an if(driver != null) before you proceed

using(driver)
{
    // something
}

这是一个很奇怪的要求,但不管你怎么说

您应该使用完全摆脱
,自己处理dispose(具有相同的结果)

这就是你想要的:

driver driver = null;

try
{
    try
    {
        driver = new driver();
    }
    catch(Exception ex)
    {
        // Here is your specific exception.
    }

    // Do something
}
finally
{
    if(driver != null)
        driver.Dispose();
}
“using”子句的主要功能是在子句内的过程完成后处理托管代码资源。它在其中“隐藏”了一个try-catch块,但是如果您真的想处理错误,您需要自己处理

例如


在处理异常后,您应该通过调用
.dispose()
来处理未使用的资源,假设后者是托管代码资源并封装了
IDisposable
接口,您可以添加一个方法来构造驱动程序并将try/catch放在其中:

private static Driver CreateDriver()
{
    try
    {
        return new Driver();
    }
    catch(Exception ex)
    {
        // whatever other exception handling you want
        return null;
    }
}    

using(var driver = CreateDriver())
{
    // something
}
当然,如果您这样做,当您的
某个
代码在
使用
块内部执行时,
驱动程序
可能为空,因此您需要对此进行检查,例如:

using(var driver = CreateDriver())
{
    if (driver != null)
    {
        // something
    }
}

不要使用
使用
。自己动手使用主要用于强制对对象调用disposed。它不会影响您的try-catch实现。“我需要使用,因为“driver=newdriver”打开了一个新窗口”-我可以建议更改该设计吗?在我看来,构造函数调用打开一个新窗口是很奇怪的。使用(var driver=CreateDriver())
并在
CreateDriver
方法中放入try/catch如何?@Joe-这是一个答案。你应该确保
driver
中不为
null
使用
@himbrombee如果catch()是正确的,我假设catch()将是致命的,如在另一次投掷、返回或其他情况下……“使用”用于强制处置,“驱动程序”在使用后会被处置吗?还是我们用错了?@Lali我真的不明白你的意思。。。是的,这就是
使用
的目的。它强制释放驱动程序实例。“它在其中“隐藏”了一个try-catch块”实际上它“隐藏”了一个try/finally块。是的……我无意中键入了catch……对不起,手动使用
Dispose()
不是一个好方法。您可以使用using-inside
try/catch
,因为它将在内部创建
try/finally
。如果未实现using子句,则从不鼓励它,只是尝试给出一个示例,当需要显式处理异常时,需要根据询问的问题手动处置托管代码资源。但是你有筑巢。如果开发人员在给定的时间内没有问题,那么我可以:)
using(var driver = CreateDriver())
{
    if (driver != null)
    {
        // something
    }
}