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%的情况下,吃这样的例外是一个非常糟糕的主意.再次:弄清楚你做错了什么并停止做.不要做错事,然后处理失败.
_.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)
我知道,这个解决方案也不是最佳的,但迄今为止我能找到的最简洁的解决方案。
你试过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处理不受控制的异常.顾名思义,应该使用例外来处理特殊情况.
在这种情况下,你正在进行标准的解析,所以做防御性编程要好得多,而不是尝试,抛出,捕捉......
| 归档时间: |
|
| 查看次数: |
7285 次 |
| 最近记录: |