Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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#_Asp.net_.net_Try Catch - Fatal编程技术网

C# 处理在试图保持性能的同时抛出异常的方法

C# 处理在试图保持性能的同时抛出异常的方法,c#,asp.net,.net,try-catch,C#,Asp.net,.net,Try Catch,我正在编写一个应用程序,该应用程序要求我循环浏览ASP.NET网站中的成员/用户列表。我正在调用一个方法,该方法可能引发我无法控制的异常 以下是一个片段: foreach(var member in members) { memberExport.Groups = GetGroups(member); } 这里是GetGroups protected string[] GetGroups(Member member) { try { return Rol

我正在编写一个应用程序,该应用程序要求我循环浏览ASP.NET网站中的成员/用户列表。我正在调用一个方法,该方法可能引发我无法控制的异常

以下是一个片段:

foreach(var member in members)
{
    memberExport.Groups = GetGroups(member);
}
这里是GetGroups

protected string[] GetGroups(Member member)
{
    try
    {
        return Roles.GetRolesForUser(member.LoginName);
    }
    catch(Exception ex)
    {
        return new string[] { "" };
    }
}
Roles.GetRolesForUser可以抛出三个不同的异常,但如果抛出异常,我不希望整个应用程序停止运行,我只希望继续运行到下一个成员

问题是,try-and-catch在性能上是昂贵的,与我不使用try-and-catch运行它相比,它花费了相当多的时间

我怎样才能在不影响性能的情况下做到这一点

基于提供的答案的我的解决方案:

有趣的是,这给了我与我最初拥有的时间相似的时间安排。

从中可以看出,此方法引发了以下异常:

  • 用户名为null时的System.ArgumentNullException
  • System.ArgumentException
    当用户名包含逗号时
  • 未启用角色管理时的System.Configuration.Provider.ProviderException
我认为你可以很容易地处理这些问题:

protected string[] GetGroups(Member member)
{
    string login = member.LoginName;

    if (login == null || login.Contains(",") || !Roles.Enabled)
        return new [] { "" };    

    return Roles.GetRolesForUser(login);    
}
从中可以看出,此方法引发了以下异常:

  • 用户名为null时的System.ArgumentNullException
  • System.ArgumentException
    当用户名包含逗号时
  • 未启用角色管理时的System.Configuration.Provider.ProviderException
我认为你可以很容易地处理这些问题:

protected string[] GetGroups(Member member)
{
    string login = member.LoginName;

    if (login == null || login.Contains(",") || !Roles.Enabled)
        return new [] { "" };    

    return Roles.GetRolesForUser(login);    
}

这真的是一个瓶颈吗?你在上面运行了探查器吗?你有权访问
GetRolesForUser
代码吗?您应该更改该方法,以便它不会抛出异常,而是返回一个空字符串。这样,你就不必在以后检查结果了。是的,我让过程在4分钟内完成,但现在我已经等了15分钟。唯一的更新是在方法周围添加try-and-catch。这很奇怪。这毫无意义——异常处理不应该增加那么多开销。如果您在第一次计时中没有try/catch,您是如何处理异常以进行计时的?我怀疑你计算时间的方式是不可比的。你到底看到了什么例外?您确定需要返回
newstring[]{”“}而不是
新字符串[0]?这很好,我可以返回新字符串[0],但这显然不是问题所在。我在一些没有成员的成员身上看到了一个例外。这些成员是系统构建时的过时成员。我已经想出了一个解决方案,我将补充我的问题。这真的是一个瓶颈吗?你在上面运行了探查器吗?你有权访问
GetRolesForUser
代码吗?您应该更改该方法,以便它不会抛出异常,而是返回一个空字符串。这样,你就不必在以后检查结果了。是的,我让过程在4分钟内完成,但现在我已经等了15分钟。唯一的更新是在方法周围添加try-and-catch。这很奇怪。这毫无意义——异常处理不应该增加那么多开销。如果您在第一次计时中没有try/catch,您是如何处理异常以进行计时的?我怀疑你计算时间的方式是不可比的。你到底看到了什么例外?您确定需要返回
newstring[]{”“}而不是
新字符串[0]?这很好,我可以返回新字符串[0],但这显然不是问题所在。我在一些没有成员的成员身上看到了一个例外。这些成员是系统构建时的过时成员。我已经想出了一个解决办法,我将把它添加到我的问题中。