Skip to content

ThrowHelper APIs #3346

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

Sergio0694
Copy link
Member

@Sergio0694 Sergio0694 commented Jun 14, 2020

Feature: new ThrowHelper APIs

PR Type

What kind of change does this PR introduce?

  • Feature

What is the current behavior?

The Microsoft.Toolkit.Diagnostics namespace exposes no ThrowHelper APIs. These are useful in situations where the user can't just invoke one of the Guard APIs to perform a check, but it might still be better to have a high performance API to delegate the exception throw operation to.

This is because the throw helper pattern allows the JIT compiler to see the exception in the faulting branch, and assume that branch is always not taken. This results in better codegen both because of this, and because the actual code to instantiate the exception object is done in a method that never inlined.

What is the new behavior?

The ThrowHelper class is now public, with a series of throw helper APIs.
All the Guard-specific helpers are still just internal.

This PR introduce helper methods to throw the following exception types:

  • ArrayTypeMismatchException
  • ArgumentException
  • ArgumentNullException
  • ArgumentOutOfRangeException
  • ExternalException
  • FormatException
  • InsufficientMemoryException
  • InvalidDataException
  • InvalidOperationException
  • LockRecursionException
  • MissingFieldException
  • MissingMemberException
  • MissingMethodException
  • NotSupportedException
  • ObjectDisposedException
  • OperationCanceledException
  • PlatformNotSupportedException
  • SynchronizationLockException
  • TimeoutException
  • UnauthorizedAccessException
  • Win32Exception

PR Checklist

Please check if your PR fulfills the following requirements:

  • Tested code with current supported SDKs
  • Pull Request has been submitted to the documentation repository instructions. Link: #370
  • Sample in sample app has been added / updated (for bug fixes / features)
  • Tests for the changes have been added (for bug fixes / features) (if applicable)
  • Header has been added to all new source files (run build/UpdateHeaders.bat)
  • Contains NO breaking changes

@ghost
Copy link

ghost commented Jun 14, 2020

Thanks Sergio0694 for opening a Pull Request! The reviewers will test the PR and highlight if there is any conflict or changes required. If the PR is approved we will proceed to merge the pull request 🙌

@ghost ghost assigned michael-hawker Jun 14, 2020
Copy link
Contributor

@john-h-k john-h-k left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@Sergio0694 Sergio0694 mentioned this pull request Jul 13, 2020
8 tasks
This reverts commit f70ae0c.
Unfortunately the attribute is actually matched by type and not just by name like the others. We should reintroduce this once either dotnet/runtime#29681 is done, or when the runtime switches to a name matching for the internal attribute, so we can just use a local copy here.
Copy link
Member

@michael-hawker michael-hawker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of questions more around organization of the code than anything else?

Are there existing unit tests for this? Is that basically by proxy through the Guard API? Should we have a few that our specific to this new public API?

@michael-hawker michael-hawker added this to the 7.0 milestone Jul 21, 2020
@michael-hawker michael-hawker added the .NET Components which are .NET based (non UWP specific) label Jul 21, 2020
@michael-hawker
Copy link
Member

Thanks for reviewing @john-h-k!

@michael-hawker michael-hawker merged commit b1a2ccf into CommunityToolkit:master Aug 19, 2020
@Sergio0694 Sergio0694 linked an issue Sep 21, 2020 that may be closed by this pull request
@Sergio0694 Sergio0694 mentioned this pull request Oct 29, 2020
7 tasks
ghost pushed a commit that referenced this pull request Nov 6, 2020
<!-- 🚨 Please Do Not skip any instructions and information mentioned below as they are all required and essential to evaluate and test the PR. By fulfilling all the required information you will be able to reduce the volume of questions and most likely help merge the PR faster 🚨 -->

## Follow up for #3346 and #3455 
<!-- Add the relevant issue number after the "#" mentioned above (for ex: Fixes #1234) which will automatically close the issue once the PR is merged. -->

<!-- Add a brief overview here of the feature/bug & fix. -->

## PR Type
What kind of change does this PR introduce?
<!-- Please uncomment one or more that apply to this PR. -->

<!-- - Bugfix -->
- Feature
<!-- - Code style update (formatting) -->
<!-- - Refactoring (no functional changes, no api changes) -->
<!-- - Build or CI related changes -->
<!-- - Documentation content changes -->
<!-- - Sample app changes -->
<!-- - Other... Please describe: -->


## What is the current behavior?
<!-- Please describe the current behavior that you are modifying, or link to a relevant issue. -->
The `ThrowHelper` class exposes static throw-helper APIs that mirror the existing constructor for all the supported exception types. In the previous PRs though I had missed the parameterless constructors, so there were no APIs for that in the `ThrowHelper` class.

## What is the new behavior?
<!-- Describe how was this issue resolved or changed? -->
`ThrowHelper` now exposes a parameterless overload for all the supported exception types that are exposed.

## PR Checklist

Please check if your PR fulfills the following requirements:

- [X] Tested code with current [supported SDKs](../readme.md#supported)
- [ ] ~~Pull Request has been submitted to the documentation repository [instructions](..\contributing.md#docs). Link: <!-- docs PR link -->~~
- [ ] ~~Sample in sample app has been added / updated (for bug fixes / features)~~
    - [ ] ~~Icon has been created (if new sample) following the [Thumbnail Style Guide and templates](https://github.com/windows-toolkit/WindowsCommunityToolkit-design-assets)~~
- [X] Tests for the changes have been added (for bug fixes / features) (if applicable)
- [X] Header has been added to all new source files (run *build/UpdateHeaders.bat*)
- [X] Contains **NO** breaking changes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature 💡 .NET Components which are .NET based (non UWP specific)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature] Expose a public ThrowHelper type
4 participants