C#中的'try'语句是否可能?

Sta*_*tan 1 c# exception-handling exception try-catch

有可能以某种方式调用tryC#中的内联语句吗?

我正在为我的网站检测语言,有时候,当语言类似于en-GR客户端时出于某种原因.NET抛出异常.所以我需要使用try,catch即使我没有抓到任何东西.

在这种情况下,这似乎完全矫枉过正.

// Set allowed languages
string[] allowedLanguages = { "en", "fr", "ru" };

// Get all possible values
var routeLanguage = (filterContext.RouteData.Values["lang"] != null && allowedLanguages.Contains(filterContext.RouteData.Values["lang"].ToString())) ? filterContext.RouteData.Values["lang"].ToString() : null;
var cookieLanguage = (filterContext.HttpContext.Request.Cookies["lang"] != null && allowedLanguages.Contains(filterContext.HttpContext.Request.Cookies["lang"].Value)) ? filterContext.HttpContext.Request.Cookies["lang"].Value : null;
string clientLanguage = null;
try
{
    clientLanguage = (filterContext.HttpContext.Request.UserLanguages != null) ? new CultureInfo(filterContext.HttpContext.Request.UserLanguages[0]).TwoLetterISOLanguageName : null; // Exception sometimes without `try`
}
catch (Exception)
{
}
Run Code Online (Sandbox Code Playgroud)

编辑

由于我无法控制用户在其文化信息中的含义,因此我无法解决异常问题..NET只是将en-FR视为无效的.

Eri*_*ert 13

首先,最好先弄清楚如何避免异常.首先要集中注意力.抛出异常有一些原因,如果你可以确定它是什么,那就不要这样做了.

要真正回答你的问题:没有开箱即用的"吃掉这个表达式中的所有异常"机制,但构建自己的机制很简单:

static T EatExceptions(Func<T> func)
{
  try { return func(); } catch { }
  return default(T);
}
...
clientLanguage = (filterContext.HttpContext.Request.UserLanguages != null) ? 
  EatExceptions(() => new CultureInfo(filterContext.HttpContext.Request.UserLanguages[0]).TwoLetterISOLanguageName) :
  null; }
Run Code Online (Sandbox Code Playgroud)

如果有人试图在我正在审查的代码中提取类似的恶作剧,那么我会......好吧,我只是说改变不会被检入.在99%的情况下,吃这样的例外是一个非常糟糕的主意.再次:弄清楚你做错了什么并停止做.不要做错事,然后处理失败.

  • @DanAtkinson:问题不在于异常缓慢。与加法相比,异常很慢,但那是因为加法*快得惊人*。您可以每秒抛出数千个异常,而不必担心性能影响。问题是例外*应该是例外*。抛出是*非本地转到*;很难想象比这更容易混淆和破坏的控制流程。因此,它应该仅限于罕见的、经过仔细分析的案例。 (2认同)

And*_*ndi 7

_.Try(() => __YourStatementHere__ );
Run Code Online (Sandbox Code Playgroud)

使用像这样的小助手类:

/// <summary>
/// Other utility functions.
/// </summary>
public static class _ {

    /// <summary>
    /// Tries to execute the given action. If it fails, nothing happens.
    /// </summary>
    public static void Try(Action action) {
        try {
            action();
        }
        catch {
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我知道,这个解决方案也不是最佳的,但迄今为止我能找到的最简洁的解决方案。


Dar*_*rov 6

你试过try/catch完全摆脱声明吗?

string clientLanguage = null;
var userLanguages = filterContext.HttpContext.Request.UserLanguages;
if (userLanguages != null && userLanguages.Length > 0)
{
    var culture = CultureInfo
        .GetCultures(CultureTypes.AllCultures)
        .FirstOrDefault(
            x => string.Equals(
                x.Name, 
                userLanguages[0].Name, 
                StringComparison.OrdinalIgnoreCase
            )
        );
    if (culture != null)
    {
        clientLanguage = culture.TwoLetterISOLanguageName;
    }
}
Run Code Online (Sandbox Code Playgroud)

仅使用try/catch处理不受控制的异常.顾名思义,应该使用例外来处理特殊情况.

在这种情况下,你正在进行标准的解析,所以做防御性编程要好得多,而不是尝试,抛出,捕捉......

  • 当然,它并没有失控.看看我的代码.我在控制它.OP试图将`TwoLetterISOLanguageName`直接传递给CultureInfo构造函数.显然,如果客户端传递了一些无效语言,这可能会引发异常.在我的例子中,我试图从不能抛出的所有可能值的列表中找到相应的CultureInfo. (2认同)