English 中文(简体)
我何时应使用ThrowHelper方法,而不是直接扔 throw?
原标题:When should I use a ThrowHelper method instead of throwing directly?

何时使用ThrowHelper方法,而不是直接投掷?

void MyMethod() {
    ...
    //throw new ArgumentNullException("paramName");
    ThrowArgumentNullException("paramName");
    ...
}
void ThrowArgumentNullException(string paramName) {
    throw new ArgumentNullException(paramName);
}

我读到的是,使用ThrowHelper方法(一种只穿透一个例外情况的方法),而不是直接投下should<>/em> 产生较小的附则。

这一点以及明显的cap势(另一层间接)可能是不直接投诚的良好原因,至少在某些情况下。

不管怎么说,海事组织的缺点也并非不重要。

  • A part of the (exceptional) control flow is hidden
  • Exceptions end up having a more cryptic stacktrace
  • the compiler (2.0) will not recognize that ThrowHelper calls are exit points from a method, hence some code-around is necessary.

我的有限经验是,总体设计往往更糟。

int MyMethod(int i) {
    switch (i) {
        case 1:
            return 1;
        default:
            ThrowMyException();
    }
    return 0; // Unreachable (but needed) code
 }

This may partly be a matter of personal taste. Anyway what are your personal guidelines about this issue? Do you find it is a good idea to use ThrowHelpers for all those common tasks like method param validation (ThrowArgumentNullException(paramName) and such)? Am I missing something obvious on this issue?

Btw I m试图避免将这一问题与validation issue混为一谈,例如:

ThrowIfNameIsNullOrEmpty(name);
最佳回答

我的缺席做法是直接从特殊法典部门退下。

南斯拉夫联邦共和国原则和3条规则在我总结如下时即为指南:如果我发现自己写了同样的第3条或第3条,我就考虑采用一种帮助方法加以总结。

然而,与其说是一种丢弃的方法,不如说是写成一种能够产生所期望的例外的工厂方法,然后从原来的地点扔掉:

public void DoStuff(string stuff)
{
    // Do something

    throw this.CreateException("Boo hiss!");
}

private MyException CreateException(string message)
{
    return new MyException(message);
}

这保存了脚印。

问题回答

这对我来说似乎是一种无谓的抽象看法。 你们有一回事的方法,被简单地称为做事。

不太按字母顺序排列的论据实际上毫无意义,因为你的法典规模很少(如果你计划的话,你不会把这个例外从你的源代码中的大量位置上 throw倒下来,那么你就只能节约一千万).。 与此同时,你指出的缺点是所有真正的关切,特别是在处理例外情况时。

基本上把像这样的小事情推向你们。 http://www.joelonsoftware.com/articles/LeakyAbstractions.html” rel=“noretinger” http://www.joelonsoftware.com/articles/LeakyAbstractions.html。

我要说,这样做的唯一合理时间是像《联邦法典》这样的时间,即该类的使用量大为分散,足以节省开支。 然而,这必须具有意义。 就你而言,我不认为你实际上拯救了任何空间。 实例: 《刑法》中的ThrowHelper通过在校方位和电话方法(获取传闻)中替代标记,缩小了规模。 你的案件只是提出同样的论点,因此没有实现任何节约。 采用你的方法,就像放弃现有的例外一样,也是代价高昂的。

从我所理解的角度来看,较小的沥青编码基本上是唯一的优势()。 这个问题见,因此,我并不期望你在此答复中看到许多论点。

这样做有两个理由。 第一个是,同一例外信息/信息应在多个地点共享。

第二是出于业绩原因。 从历史上看,一种方法中的“<代码>throw”将防止采用这种方法,从而对小型方法的绩效产生严重影响。 通常,在收集类型中,修改收集方法的小型方法需要在进行修改之前检查各项约束。

想法是,我们希望将正常案件放在尽可能高的顺序上,这样,trow>/code>就不得不坚持其自己的方法,而这种方法并非一线。

See these blog posts among many others for further explanation : https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/#exceptions https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/

我总是试图仅仅为了定制的目的而提出自己的例外。 我可以发出一个短短信,告诉我问题是什么(可能来自什么地方)。 就业绩问题而言,我尽量限制我软件的释放版本上所投的例外情况数目,因此我从未实际对此进行过太多思考。 我很想知道其他话。

这是我的两点。 因此,请予以考虑。

尚未提及的利用扔 throw器或例外因素的方法的好处是可能为此目的通过代表。 在利用一名扔 throw者代表时,人们有可能不扔 throw物(在某些情况下,这是一件好事;在其他情况下是一件坏事)。 例如:

string TryGetEntry(string key, Funct<problemCause, string> errorHandler)
{
  if (disposed)
    return errorHandler(problemCause.ObjectDisposed);
  else if (...entry_doesnt_exist...)
    return errorHandler(problemCause.ObjectNotFound);
  else
    return ...entry...;
}
string GetEntry(string key)
{
  return TryGetEntry(key, ThrowExceptionOnError);
}
bool TryGetEntry(string key, ref result)
{
  bool ok;
  string result;
  result = TryGetEntry(key, (problemCause theProblem) => {ok=false; return (string)null;});
  return ok;
}

采用这种办法,人们可能很容易使用一种带有各种错误处理战略的例行做法。 可以通过使TryGetEntry方法接受一种通用的参数,加上这种参数的重估参数,以及接受这种重估参数的代表来消除关闭的必要性。

虽然小条条条条条形码似乎只为你节省了几条千叶,但它明确界定了“多条”效果表现,因为更多的代码必须装满/载荷,以操作你的方法,这也意味着更多的碎块。 如果你在每件微型刺激事项中写出高价代码,那么它便会处理。

但更重要的是,你可以地方化或一天就希望你发出例外信息。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...