Skip to content

[breaking change] Change the context for the operand of throw to Object. #56065

@stereotype441

Description

@stereotype441

Intended Change

The type schema for type inference of the operand of a throw expression will be changed from _ (the unknown type) to non-nullable Object.

Rationale

The type schema for an expression is intended to capture information from the surrounding context about what static type the expression is expected or intended to have. Since the operand of a throw expression is required by the compiler to be assignable to Object, it makes sense for this type to also be the context. Making this change furthers a longstanding goal of removing inconsistencies and unexpected behaviors from the Dart type inference process.

Expected Impact

The impact of this change is expected to be very low, since the operands of most throw expressions do not require any type inference. A trial run of this change over Google's internal Dart code base caused zero breakages.

However, it's theoretically possible that some code could change behavior as a result of this change. Here is an example of a program whose behavior would change:

T f<T>() {
  return StateError('f<$T> was called') as T;
}

main() {
  try {
    throw f();
  } on StateError catch (e) {
    print(e);
  }
}

Today this program prints Bad state: f<dynamic> was called. With the change, it will print Bad state: f<Object> was called.

Mitigation

In the unlikely event that some code is affected by this change, the old behavior may be restored by supplying explicit types inside the operand of the throw expression, so that no type inference is needed. For example, in the code above, the old behavior may be restored by changing throw f() to throw f<dynamic>().

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-languageDart language related items (some items might be better tracked at github.com/dart-lang/language).breaking-change-approvedbreaking-change-requestThis tracks requests for feedback on breaking changestriage-automationSee https://github.com/dart-lang/ecosystem/tree/main/pkgs/sdk_triage_bot.type-enhancementA request for a change that isn't a bug

    Type

    No type

    Projects

    Status

    Complete

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions