Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# 使用变量外部Try-Catch_C# - Fatal编程技术网

C# 使用变量外部Try-Catch

C# 使用变量外部Try-Catch,c#,C#,我需要使用try块中初始化的变量的值。我有这个基本代码 Customer customer = null; try { customer = new Customer(....); } catch (Exception){} string customerCode = customer.Code; 如果没有异常,则客户完全可用,但如果有异常,则客户未初始化,则返回null 我已经检查了customer在块内的初始化是否正确。在内部,即使在异常情况下也完全可用。但我需要它以后用 有什么办

我需要使用try块中初始化的变量的值。我有这个基本代码

Customer customer = null;
try
{
    customer = new Customer(....);
}
catch (Exception){}
string customerCode = customer.Code;
如果没有异常,则客户完全可用,但如果有异常,则客户未初始化,则返回null

我已经检查了customer在块内的初始化是否正确。在内部,即使在异常情况下也完全可用。但我需要它以后用

有什么办法可以一直留住客户吗?:)

编辑:

正如你所想,这是伪代码。正如我所读到的,在构造函数中使用异常似乎是个坏主意。这是我的构造函数的真实代码的一部分

public class DirectDebitRemmitanceReject
{
    int numberOfTransactions;
    decimal controlSum;
    List<DirectDebitTransactionReject> directDebitTransactionRejects;

    public DirectDebitRemmitanceReject(
        int numberOfTransactions,
        decimal controlSum, 
        List<DirectDebitTransactionReject> directDebitTransactionRejects)
    {
        this.numberOfTransactions = numberOfTransactions;
        this.controlSum = controlSum;
        this.directDebitTransactionRejects = directDebitTransactionRejects;

        if (TheProvidedNumberOfTransactionsIsWrong()) ChangeNumberOfTransactionsAndRiseException();
        if (TheProvidedControlSumIsWrong()) ChangeControlSumAndRiseException();
    }

    private bool TheProvidedNumberOfTransactionsIsWrong()
    {
        return (numberOfTransactions != directDebitTransactionRejects.Count)
    }

    private bool TheProvidedControlSumIsWrong()
    {
        return (controlSum !=directDebitTransactionRejects.Select(ddRemmitanceReject => ddRemmitanceReject.Amount).Sum();)
    }

    private void ChangeNumberOfTransactionsAndRiseException()
    {
        ......
        ......
        throw new ArgumentException(exceptionMessage, "numberOfTransactions")

    private void ChangeControlSumAndRiseException()
    {
        ......
        ......
        throw new ArgumentException(exceptionMessage, "controlSum")
    } 
} 
但是我不能在'try'块之外断言DirectDebitRemitanceReject.ControlSum

所以。。。我是否尝试另一种方法(从构造函数内部删除异常)或是否有其他解决方法

谢谢!:)


(对不起,编辑太多了):(

你的例子很好地说明了为什么要写作

catch (Exception){}
这是一种非常糟糕的做法

当你捕获一个异常时,你应该对它做些什么。如果你不知道如何处理代码中某个特定方法中的异常,不要在该方法中捕获异常

如果您总是需要客户,即使其检索导致异常,也可以向
catch
块添加一些代码,以将
customer
变量设置为某个默认对象:

try {
    ...
} catch (Exception) {
    customer = Customer.Unknown;
}
这假设
Customer
具有类型为
Customer
的属性
Unknown
,具有一些默认行为


注释:需要警告我的代码的上层。只是,当我创建一个实例时,创建它,但警告错误的参数。你能给我推荐一些更好的方法吗

创建工厂以在创建用户时验证用户:

class CustomerCreationResult {
    public Customer Customer() { get; set; }
    public CustomerCreationError Error() { get; set; }
}

class CustomerFactory {
    public CustomerCreationResult CreateCustomer(String name, int age) { ... }
}
现在,您可以按如下方式创建客户:

var r = myCustomerFactory.CreateCustomer(name, age);
if (r.getError() != null) {
    ... // Present the error
}
Customer customer = r.Customer;
...

如果客户总是正确初始化,那么为什么在try块中有它

如果您想在异常发生时保持它,可以将customer的初始化移到try块之外,或者对较小的代码块使用try/catch

例如:

Customer customer = null;
try
{
    //in this block do the stuff that is unlikely to cause exceptions
    customer = new Customer(...);

    try
    {
         //stuff that is likely to cause exceptions
    }
    catch(Exception e)
    {
         //handle likely errors
    }
catch (Exception e)
{
    //handle the unusual errors
}

我认为dasblinkenlight的答案很好,但就最简单的目的而言,一个
if
就足够了:

string customerCode = "";
if (customer!=null)
{
    customerCode = customer.Code;
}

你真的应该检查异常…

这意味着try没有执行该语句。变量在try块后不会丢失其值。你可能有异常。如果你发布实际代码,我们可能会提供帮助。从代码的外观判断(特别是因为构造函数不应该抛出异常)我假设它是伪代码。你可能想看看你在构造函数中做了什么。你的构造函数最好不要抛出异常。如果你总是需要客户,为什么不删除
try
-
catch
?@JeppeStigNielsen为什么会有帮助?try/catch不能清除值。@dman2306 why
catch客户的实例,请使用code>并吞下异常。全面捕获通常是个坏主意。如果客户总是正确初始化,那么为什么要在try块中使用它?为什么要进行异常处理?来处理异常。这一次它不起作用。如果您希望在异常发生时保持它curs…,这是不可能的。如果构造函数失败,你根本就没有实例。理论上,任何对
new
的调用都可能会失败,出现
OutOfMemoryException
,因此永远没有办法100%保证它总是正确初始化。通常,一旦遇到OOM异常,你就完成了,但关键是异常可能会发生在这一行,因此一个
try
/
catch
并不是100%愚蠢。好吧,这很公平。但根据他最初的帖子,客户总是正确地初始化。如果他的方法中有一部分更可能产生问题,那么需要以某种方式处理该部分,以便他的外部try块不会失败。@AdamP yes,as经验丰富的开发人员我们应该告诉他,他不能保证某些东西总是有效的,因为他正在处理的设备具有超出他控制范围的限制。记住,他是来学习的。如果他的陈述是真的,它总是正确初始化,那么它就永远不会为空,他也不会在这里。因此,他是不正确的。我不确定w这是什么意思或者它是如何解决问题的?我不记得他的问题提到了任何
NullReferenceException
,他问为什么它为null。对不起,我使用了伪代码,但没有解释构造函数的真实行为。我编辑了我的示例并添加了它。我想使用exception来表示初始化过程中出现了参数错误不可恢复,即使构造函数解决了它。可能是异常并不是处理此问题的最佳方法。有什么建议吗?谢谢!@Kaikus异常应该用于不可恢复的情况。如果您想警告用户一个可恢复的错误,请使用不同的机制报告您的警告。需要警告我的代码的上层。Just、 当我创建一个实例时,请创建它,但要警告错误的参数。你能给我推荐一些更好的方法吗?谢谢!非常感谢!我将使用以下方法:)
string customerCode = "";
if (customer!=null)
{
    customerCode = customer.Code;
}